Move groupbasedpolicy-ui to groupbased-old-ui
[groupbasedpolicy.git] / groupbasedpolicy-old-ui / module / src / main / resources / gbp / gbp.controller.js
old mode 100755 (executable)
new mode 100644 (file)
similarity index 97%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.controller.js
index d139f9c..e492a3a
-var modules = ['app/gbp/gbp.module',\r
-               'app/gbp/gbp.services'\r
-               ];\r
-\r
-\r
-define(modules, function(gbp) {\r
-\r
-    gbp.register.controller('gbpCtrl', ['$scope', '$rootScope', 'GBPTenantServices','DesignGbpFactory', 'GBPConstants',\r
-        function ($scope, $rootScope, GBPTenantServices, DesignGbpFactory, GBPConstants) {\r
-            $rootScope['section_logo'] = 'logo_gbp';\r
-            $scope.view_path =  'src/app/gbp/views/';\r
-\r
-            $scope.mainView = {\r
-                main: true,\r
-                'policy-renderer': false,\r
-                governance: false\r
-            };\r
-\r
-            $scope.policyRendererView = {\r
-                slider : true,\r
-                basic : true,\r
-                policy: false,\r
-                tenants : false,\r
-                l2l3 : false,\r
-                epg : false,\r
-                contracts : false,\r
-                docs : false,\r
-                groupMenu: false,\r
-                classifiers: false,\r
-                actions: false,\r
-                registerEndpoint : false,\r
-                registerL3PrefixEndpoint : false\r
-            };\r
-\r
-            $scope.subMenuView = {\r
-                governance : false,\r
-                policy : false,\r
-                policySub : false,\r
-                renderers : false,\r
-                endpoints : false\r
-            };\r
-\r
-            $scope.breadcrumbs = {'l1' : null,\r
-                                  'l2' : null,\r
-                                  'l3' : null};\r
-\r
-            $scope.wizards = {\r
-                accessModelWizard: false,\r
-                actionReferenceWizard: false\r
-            };\r
-\r
-            $scope.setBreadcrumb = function(level, label, visible){\r
-                $scope.breadcrumbs[level] = visible ? label : null;\r
-                if(level === 'l1'){\r
-                    $scope.breadcrumbs.l2 = null;\r
-                    $scope.breadcrumbs.l3 = null;\r
-                }\r
-                if(level === 'l2'){\r
-                    $scope.breadcrumbs.l3 = null;\r
-                }\r
-            };\r
-\r
-            $scope.setViewExpand = function(menu, expand, show){\r
-                $scope[menu][expand] = show ? true : !$scope[menu][expand];\r
-                for ( var property in $scope[menu] ) {\r
-                    $scope[menu][property] = expand !== property ? false : $scope[menu][expand];\r
-                }\r
-\r
-            };\r
-\r
-            $scope.toggleExpandedMM = function(expand, show, broadcast){\r
-                $scope.setViewExpand('mainView',expand, show);\r
-\r
-                if ( broadcast ) {\r
-                    $scope.$broadcast(broadcast);\r
-                }\r
-            };\r
-\r
-            $scope.sliceLabel = function(label){\r
-                return label.length > GBPConstants.numbers.displayLabelLength ? label.slice(0,GBPConstants.numbers.displayLabelLength)+'...' : label;\r
-            };\r
-\r
-            $scope.getDisplayLabel = function(obj, labelArray, dontSlice){\r
-                var ret = '';\r
-\r
-                if((typeof labelArray) === 'string'){\r
-                    ret = obj[labelArray];\r
-                } else if (angular.isFunction(labelArray)) {\r
-                    ret = labelArray(obj);\r
-                } else {\r
-                    labelArray.some(function(labelParam) {\r
-                        if(angular.isFunction(labelParam)) {\r
-                            ret = labelParam(obj);\r
-                        } else if(obj.hasOwnProperty(labelParam)) {\r
-                            ret = obj[labelParam];\r
-                        }\r
-                        return ret;\r
-                    });\r
-                }\r
-\r
-                return dontSlice ? ret : $scope.sliceLabel(ret);\r
-            };\r
-\r
-            // TENANTS\r
-            $scope.tenantList = [];\r
-            $scope.selectedTenant = null;\r
-            $scope.tenantDisplayLabel = ['name' , 'id'];\r
-\r
-            $scope.loadTenants = function() {\r
-                GBPTenantServices.load(\r
-                    function(tenants) {\r
-                        $scope.tenantList = tenants;\r
-                        console.log('$scope.tenantList', $scope.tenantList);\r
-                    },\r
-                    function(){\r
-                        //TODO error\r
-                    });\r
-\r
-                DesignGbpFactory.setMainClass();\r
-            };\r
-\r
-            $scope.setTenant = function(selectedTenant) {\r
-                $scope.selectedTenant = selectedTenant;\r
-                $scope.$broadcast('GBP_TENANT_RELOAD', $scope.selectedTenant);\r
-            };\r
-\r
-            $scope.loadTenants();\r
-\r
-            $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){\r
-                $scope.loadTenants();\r
-            });\r
-\r
-            $scope.sendReloadEventFromRoot = function(eventName, val) {\r
-                $scope.$broadcast(eventName, val);\r
-            };\r
-\r
-\r
-            // TODO: rework, use $scope.setViewContent or something\r
-            $scope.showWizard = function(wizardName, broadcast, broadcastedData, path) {\r
-                $scope.wizards[wizardName] = true;\r
-\r
-                if ( broadcast ) {\r
-                    $scope.sendReloadEventFromRoot(broadcast, {data: broadcastedData, path: path});\r
-                }\r
-            };\r
-\r
-            $scope.closeWizard = function(wizardName) {\r
-                $scope.wizards[wizardName] = false;\r
-            };\r
-\r
-            $scope.updateList = function(list, object, key) {\r
-                var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
-\r
-                if(elementPos < 0) {\r
-                    list.push(object);\r
-                }\r
-                else {\r
-                    list[elementPos] = object;\r
-                }\r
-            };\r
-\r
-    }]);\r
-\r
-    gbp.register.controller('governanceCtrl', ['$rootScope','$scope',\r
-        function ($rootScope, $scope) {\r
-            $scope.menuTpl = 'main-menu';\r
-            $scope.menuBox = null;\r
-            $scope.contentTpl = 'main';\r
-            // $scope.selectedTenant = null;\r
-            $scope.rendererList = [];\r
-            var broadcastObj = {};\r
-\r
-            $scope.rendererList.push({'name' : 'of_overlay', 'id' : 0});\r
-\r
-            $scope.toggleExpanded = function(expand, menu, tplType){\r
-                var type = tplType ? tplType : 'contentTpl';\r
-                $scope.menuBox = null;\r
-                \r
-                $scope[type] = expand;\r
-\r
-                if ( menu && menu === false ) {\r
-                    $scope.menuTpl = !menu ? null : menu;\r
-                }\r
-            };\r
-\r
-            \r
-\r
-            $scope.setViewContent = function(tplName, data, broadcast, tplType) {\r
-\r
-                if ( $scope[tplType] === tplName ) {\r
-                    $scope.$broadcast(broadcast, data, true);\r
-                } else {\r
-\r
-                    broadcastObj[tplType] = {};\r
-                    broadcastObj[tplType].name = broadcast;\r
-                    broadcastObj[tplType].data = data;\r
-\r
-                    $scope.toggleExpanded(tplName, null, tplType);\r
-                    $scope.$apply();\r
-\r
-                }\r
-            };\r
-\r
-            $scope.broadcastCalling = function(tplType){\r
-                $scope.$broadcast(broadcastObj[tplType].name, broadcastObj[tplType].data);\r
-            };\r
-\r
-            $scope.checkBroadcastCalling = function(tplName){\r
-                var objClickAction = {\r
-                    'epg-detail': function(){\r
-                        $scope.broadcastCalling('contentTpl');\r
-                    },\r
-                    'subject-detail': function(){\r
-                        $scope.broadcastCalling('contentTpl');\r
-                    }\r
-                };\r
-\r
-                if ( angular.isFunction(objClickAction[tplName]) ) {\r
-                    objClickAction[tplName]();\r
-                }\r
-                \r
-            };\r
-\r
-\r
-            $scope.$on('GOV_INIT', function(){\r
-                $scope.menuTpl = 'main-menu';\r
-                $scope.contentTpl = 'main';\r
-                // $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
-                $scope.menuBox = null;\r
-            });\r
-\r
-            $scope.$on('GBP_TENANT_RELOAD', function(e, obj){\r
-                $scope.selectedTenant = obj;\r
-            });\r
-\r
-\r
-    }]);\r
-\r
-    gbp.register.controller('boxStaticCtrl',['$scope',\r
-        function($scope){\r
-\r
-        $scope.selectedObj = null;\r
-\r
-        $scope.getLabel = function(id, type){\r
-                var objAction = {\r
-                providerItems: function(){\r
-                    var name = $scope.selectedObj[type][id].attributes.objData['name'];\r
-                    return name ? name + ' : ' + id : id;\r
-                },\r
-                consumerItems: function(){\r
-                    var name = $scope.selectedObj[type][id].attributes.objData['name'];\r
-                    return name ? name + ' : ' + id : id;\r
-                }\r
-            };\r
-\r
-            if ( angular.isFunction(objAction[type]) ) {\r
-                return objAction[type]();\r
-            }\r
-        };\r
-\r
-        $scope.$on('SET_SEL_STA_OBJ', function(obj, data, apply){\r
-            $scope.selectedObj = data;\r
-\r
-            if ( apply ) {\r
-                $scope.$apply();\r
-            }\r
-\r
-        });\r
-\r
-    }]);\r
-\r
-    gbp.register.controller('graphCtrl', ['$scope', function($scope){\r
-        var paper = null,\r
-            paperScale = 1;\r
-\r
-        $scope.init = function(paperInstance){\r
-            paper = paperInstance;\r
-            $scope.loadMouseScrollEvent();\r
-        };\r
-\r
-\r
-        $scope.zoom = function(out){\r
-            paperScale = out ? paperScale - 0.1 : paperScale >= 1 ? 1 : paperScale + 0.1;\r
-            paper.scale(paperScale, paperScale);\r
-        };\r
-\r
-        \r
-\r
-        $scope.loadMouseScrollEvent = function(){\r
-            /*mouse wheel event for zooming*/\r
-            var graph = document.getElementById('graph'),\r
-            MouseWheelHandler = function(e){\r
-                var mouseEvent = window.event || e; // old IE support\r
-                var delta = Math.max(-1, Math.min(1, (mouseEvent.wheelDelta || -mouseEvent.detail)));\r
-                $scope.zoom(delta === 1 ? false : true);\r
-            };\r
-\r
-            if (graph.addEventListener) {\r
-                // IE9, Chrome, Safari, Opera\r
-                graph.addEventListener("mousewheel", MouseWheelHandler, false);\r
-                // Firefox\r
-                graph.addEventListener("DOMMouseScroll", MouseWheelHandler, false);\r
-            }\r
-            // IE 6/7/8\r
-            else {graph.attachEvent("onmousewheel", MouseWheelHandler);}\r
-            /*mouse wheel event for zooming - end*/\r
-        };\r
-        \r
-    }]);\r
-\r
-    gbp.register.controller('expressedPolicyCtrl', ['$scope', 'JointGraphFactory', 'JointGraphOffsetFactory', 'GBPConstants',\r
-        function ($scope, JointGraphFactory, JointGraphOffsetFactory, GBPConstants) {\r
-            var paper = JointGraphFactory.createGraph(),\r
-                epgItems = [],\r
-                contractItems = [],\r
-                linkItems = [];\r
-\r
-            var objClickAction = {\r
-                epg: function(data){\r
-                    $scope.setViewContent('epg-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                },\r
-                contract: function(data){\r
-                    $scope.setViewContent('contract-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                }\r
-            };\r
-\r
-            paper.on('cell:pointerdown', function(cell) { \r
-                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {\r
-                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);\r
-                }\r
-            });\r
-\r
-            var createEpgLinks = function(epg, epgItem, contracts) {\r
-                var providers = epg['provider-named-selector'] && epg['provider-named-selector'].length>0 ? epg['provider-named-selector'] : [];\r
-                var consumers = epg['consumer-named-selector'] && epg['consumer-named-selector'].length>0 ? epg['consumer-named-selector'] : [];\r
-                var consumerLinkItems = [];\r
-                var providerLinkItems = [];\r
-\r
-                consumers.forEach(function(c) {\r
-                    c.contract.forEach(function(con) {\r
-                        consumerLinkItems.push(JointGraphFactory.createLink(contracts[con].id, epgItem.id, 'green'));\r
-                    });\r
-                });\r
-\r
-                providers.forEach(function(p) {\r
-                    p.contract.forEach(function(con) {\r
-                        providerLinkItems.push(JointGraphFactory.createLink(epgItem.id, contracts[con].id, 'blue'));\r
-                    });\r
-                });\r
-\r
-                JointGraphFactory.addItemList(paper.model, providerLinkItems);\r
-                JointGraphFactory.addItemList(paper.model, consumerLinkItems);\r
-\r
-            };\r
-\r
-            var loadData = function() {\r
-                if($scope.selectedTenant) {\r
-                    var offsetObj = {\r
-                            ow: 100,\r
-                            oh: 100,\r
-                            w: 100,\r
-                            h: 100\r
-                        },\r
-                        marginObj = {\r
-                            w: 50,\r
-                            h: 80\r
-                        },\r
-                        offsetHobj = {\r
-                            contract: 0,\r
-                            epg: 0\r
-                        },\r
-                        itemsArray = {\r
-                            contract: [],\r
-                            epg: []\r
-                        };\r
-\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-\r
-                    if ( $scope.selectedTenant && $scope.selectedTenant.contract ) {\r
-\r
-                        $scope.selectedTenant.contract.forEach(function(c, i) {\r
-                            var label = c.description ? $scope.sliceLabel(c.description) : c.id,\r
-                                width = JointGraphFactory.getLabelLength(label.length);\r
-                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract');\r
-\r
-                            itemsArray.contract.push(item);\r
-\r
-                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                            JointGraphFactory.addItem(paper.model, item);\r
-                            contractItems[c.id] = item;\r
-                        });\r
-\r
-                        offsetHobj.contract = offsetObj.h;\r
-\r
-                    }\r
-\r
-                    if ( $scope.selectedTenant && $scope.selectedTenant['endpoint-group'] ) {\r
-\r
-                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400);\r
-                        $scope.selectedTenant['endpoint-group'].forEach(function(e, i) {\r
-                            var label = e.name || e.id,\r
-                                width = JointGraphFactory.getLabelLength(label.length);\r
-                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.epg, e, 'Click to see epg info', GBPConstants.colors.graph['pns'], 'EP group');\r
-\r
-                            itemsArray.epg.push(item);\r
-\r
-                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                            JointGraphFactory.addItem(paper.model, item);\r
-                            epgItems[e.id] = item;\r
-\r
-                            createEpgLinks(e, item, contractItems);\r
-                        });\r
-                        \r
-                    }\r
-\r
-                    offsetHobj.epg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.contract, 'y');\r
-                    JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.epg ,offsetHobj.epg, paper);\r
-                }\r
-\r
-            };\r
-\r
-            $scope.getPaperObj = function(){\r
-                return paper;\r
-            };\r
-\r
-            $scope.$on('GBP_TENANT_RELOAD',function(){\r
-                if ($scope.selectedTenant) {\r
-                    loadData();\r
-                }\r
-                else {\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-                }\r
-            });\r
-            \r
-            loadData();\r
-    }]);\r
-\r
-    gbp.register.controller('deliveredPolicyCtrl', ['$scope', 'GPBServices', 'JointGraphFactory', 'GBPGovernanceServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
-        function ($scope, GPBServices, JointGraphFactory, GBPGovernanceServices, JointGraphOffsetFactory, GBPConstants) {\r
-            var paper = JointGraphFactory.createGraph(),\r
-                providerItems = {},\r
-                consumerItems = {},\r
-                subjectItems = {};\r
-\r
-            var getEpList = function() {\r
-                var providerEpKeys = Object.keys(providerItems),\r
-                    consumerEpKeys = Object.keys(consumerItems),\r
-                    epList = providerEpKeys.map(function (k) {\r
-                        return providerItems[k].attributes.objData;\r
-                    });\r
-\r
-                consumerEpKeys.forEach(function(k) {\r
-                    if(providerEpKeys.indexOf(k) === -1) {\r
-                        epList.push(consumerItems[k].attributes.objData);\r
-                    }\r
-                });\r
-\r
-                return epList;\r
-            };\r
-\r
-            var getSubjList = function() {\r
-                return Object.keys(subjectItems).map(function (k) {\r
-                    return subjectItems[k].attributes.objData;\r
-                });\r
-            };\r
-\r
-            var objClickAction = {\r
-                subject: function(data){\r
-                        data.providerItems = providerItems;\r
-                        data.consumerItems = consumerItems;\r
-                    $scope.setViewContent('subject-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                },\r
-                consumer: function(data) {\r
-                    $scope.setViewContent('epg-content-static', data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                },\r
-                provider: function(data) {\r
-                    $scope.setViewContent('epg-content-static', data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                }\r
-            };\r
-\r
-            var objDblClickAction = {\r
-                consumer: function(data){\r
-                       $scope.setBreadcrumb('l3', 'Endpoint group detail', true);\r
-                       $scope.setViewContent('epg-detail', { ep: data, epList: getEpList() }, 'SET_SELECTED_EPG','contentTpl');\r
-                },\r
-                provider: function(data){\r
-                       $scope.setBreadcrumb('l3', 'Endpoint group detail', true);\r
-                       $scope.setViewContent('epg-detail', { ep: data, epList: getEpList() }, 'SET_SELECTED_EPG','contentTpl');\r
-                },\r
-                subject: function(data) {\r
-                        var obj = { subject: data, \r
-                                    subjList: Object.keys(subjectItems).map(function (k) {\r
-                                                return subjectItems[k].attributes.objData;\r
-                                            }),\r
-                                    providerItems: providerItems,\r
-                                    consumerItems: consumerItems\r
-                                };\r
-                        $scope.setBreadcrumb('l3', 'Subject detail', true);\r
-                        $scope.setViewContent('subject-detail', obj, 'SET_SELECTED_SUBJECT','contentTpl');\r
-                }\r
-            };\r
-\r
-            paper.on('cell:pointerdown', function(cell) { \r
-                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {\r
-                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);\r
-                }\r
-            });\r
-\r
-            paper.on('cell:pointerdblclick', function(cell) { \r
-                objDblClickAction[cell.model.attributes.objType](cell.model.attributes.objData);\r
-            });\r
-\r
-            var createSubjectLinks = function(subject, subjectItem, providerItems, consumerItems) {\r
-                var providerLinkItems = subject.providers.map(function(p) {\r
-                        return JointGraphFactory.createLink(providerItems[p].id, subjectItem.id, 'green');\r
-                    });\r
-                    consumerLinkItems = subject.consumers.map(function(c) {\r
-                        return JointGraphFactory.createLink(subjectItem.id, consumerItems[c].id, 'blue');\r
-                    });\r
-\r
-                JointGraphFactory.addItemList(paper.model, providerLinkItems);\r
-                JointGraphFactory.addItemList(paper.model, consumerLinkItems);\r
-            };\r
-\r
-            var loadData = function() {\r
-                if($scope.selectedTenant) {\r
-                    providerItems = {};\r
-                    consumerItems = {};\r
-                    subjectItems = {};\r
-\r
-                    var classifierInstances = $scope.selectedTenant['subject-feature-instances'] && \r
-                                          $scope.selectedTenant['subject-feature-instances']['classifier-instance'] && \r
-                                          $scope.selectedTenant['subject-feature-instances']['classifier-instance'].length > 0 ? $scope.selectedTenant['subject-feature-instances']['classifier-instance'] : [];\r
-\r
-                    var offsetObj = {\r
-                            ow: 100,\r
-                            oh: 100,\r
-                            w: 100,\r
-                            h: 100\r
-                        },\r
-                        marginObj = {\r
-                            w: 50,\r
-                            h: 80\r
-                        },\r
-                        offsetHobj = {\r
-                            pEpg: 0,\r
-                            cEpg: 0,\r
-                            subject: 0\r
-                        },\r
-                        itemsArray = {\r
-                            pEpg: [],\r
-                            cEpg: [],\r
-                            subject: []\r
-                        };\r
-\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-\r
-                    GBPGovernanceServices.getEPGsAndSubjects($scope.selectedTenant.id, classifierInstances, function(data){\r
-                        data.providers.forEach(function(p, i) {\r
-                            var relatedObj = GPBServices.getPropFromListByProp($scope.selectedTenant['endpoint-group'], 'id', p.id),\r
-                                label = relatedObj.name || p.id,\r
-                                width = JointGraphFactory.getLabelLength(label.length);\r
-\r
-                            relatedObj.rules = p.rules;\r
-                            var item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.provider, relatedObj, 'Click to see epg info, doubleclick to see Endpoint group detail', GBPConstants.colors.graph['pns'], 'Provider EPG');\r
-\r
-                            itemsArray.pEpg.push(item);\r
-\r
-                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                            JointGraphFactory.addItem(paper.model, item);\r
-                            providerItems[p.id] = item;\r
-                        });\r
-\r
-                        offsetHobj.pEpg = offsetObj.h;\r
-\r
-                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 500);\r
-                        data.consumers.forEach(function(c, i) {\r
-                            var relatedObj = GPBServices.getPropFromListByProp($scope.selectedTenant['endpoint-group'], 'id', c.id),\r
-                                label = relatedObj.name || c.id,\r
-                                width = JointGraphFactory.getLabelLength(label.length);\r
-\r
-                            relatedObj.rules = c.rules;\r
-                            var item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.consumer, relatedObj, 'Click to see epg info, doubleclick to see Endpoint group detail', GBPConstants.colors.graph['cns'], 'Consumer EPG');\r
-\r
-                            itemsArray.cEpg.push(item);\r
-\r
-                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                            JointGraphFactory.addItem(paper.model, item);\r
-                            consumerItems[c.id] = item;\r
-                        });\r
-\r
-                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetHobj.pEpg > 300 ? offsetHobj.pEpg : 300);\r
-                        data.subjects.forEach(function(s, i) {\r
-                            var label = s.name,\r
-                                width = JointGraphFactory.getLabelLength(label.length),\r
-                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.subject, s, 'Click to see subject info, doubleclick to see Subject detail', GBPConstants.colors.graph['subject'], 'Subject');\r
-\r
-                            itemsArray.subject.push(item);\r
-\r
-                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                            JointGraphFactory.addItem(paper.model, item);\r
-                            subjectItems[s.name] = item;\r
-                            createSubjectLinks(s, item, providerItems, consumerItems);\r
-                        });\r
-\r
-                        offsetHobj.pEpg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.pEpg, 'y');\r
-                        JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.subject ,offsetHobj.pEpg, paper);\r
-                        offsetHobj.subject = JointGraphOffsetFactory.getCurrentOffset(itemsArray.subject, 'y');\r
-                        JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.cEpg ,offsetHobj.subject, paper);\r
-\r
-                    }, function(){});\r
-\r
-                }\r
-\r
-\r
-                // paper.scaleContentToFit();\r
-                // paper.fitToContent();\r
-            };\r
-\r
-            $scope.getPaperObj = function(){\r
-                return paper;\r
-            };\r
-\r
-\r
-            $scope.$on('GBP_TENANT_RELOAD',function(){\r
-                if ($scope.selectedTenant) {\r
-                    loadData();\r
-                }\r
-                else {\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-                }\r
-            });\r
-\r
-            loadData();\r
-    }]);\r
-\r
-    gbp.register.controller('subjectDetailCtrl', ['$scope', 'GPBServices', 'JointGraphFactory', 'GBPGovernanceServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
-        function ($scope, GPBServices, JointGraphFactory, GBPGovernanceServices, JointGraphOffsetFactory, GBPConstants) {\r
-            $scope.selectedSubject = null;\r
-            $scope.subjectList = [];\r
-\r
-            var paper = JointGraphFactory.createGraph(),\r
-                subjectItem = null,\r
-                ruleItems = {},\r
-                subjectItems = {};\r
-\r
-            var createSubjectLinks = function(subjectItem, ruleItem) {\r
-                var linkItem = JointGraphFactory.createLink(subjectItem.id, ruleItem.id, 'blue');\r
-                JointGraphFactory.addItem(paper.model, linkItem);\r
-            };\r
-\r
-            paper.on('cell:pointerdown', function(cell) { \r
-                var objClickAction = {\r
-                    subject: function(data){\r
-                        $scope.setViewContent('subject-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                    },\r
-                    rule: function(data){\r
-                        $scope.setViewContent('rule-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                    }\r
-                };\r
-\r
-                // console.log('cell.model.attributes.objType', cell.model.attributes.objType, cell.model.attributes.objData);\r
-                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {\r
-                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);\r
-                }\r
-            });\r
-\r
-            var loadData = function() {\r
-                if($scope.selectedSubject) {\r
-                    subjectItem = null;\r
-                    ruleItems = {};\r
-\r
-                    var offsetObj = {\r
-                            ow: 100,\r
-                            oh: 100,\r
-                            w: 100,\r
-                            h: 100\r
-                        },\r
-                        marginObj = {\r
-                            w: 50,\r
-                            h: 80\r
-                        };\r
-\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-\r
-                    var label = $scope.selectedSubject.name || $scope.selectedSubject.id,\r
-                        width = JointGraphFactory.getLabelLength(label.length);\r
-                        subjectItem = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.subject, $scope.selectedSubject, 'Click to see subject info', GBPConstants.colors.graph['subject'], 'Subject');\r
-\r
-                    JointGraphFactory.addItem(paper.model, subjectItem);\r
-\r
-                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 300);\r
-                    $scope.selectedSubject.rules.forEach(function(r, i) {\r
-                        var label = r.name,\r
-                            width = JointGraphFactory.getLabelLength(label.length);\r
-                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.rule, r, 'Click to see rule info', GBPConstants.colors.graph['cns'], 'Rule');\r
-\r
-                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper);\r
-                        JointGraphFactory.addItem(paper.model, item);\r
-                        ruleItems[r.name] = item;\r
-\r
-                        createSubjectLinks(subjectItem, item);\r
-                    });\r
-                }\r
-            };\r
-\r
-            $scope.getPaperObj = function(){\r
-                return paper;\r
-            };\r
-\r
-            $scope.$on('SET_SELECTED_SUBJECT', function(event, data){\r
-                $scope.selectedSubject = data.subject;\r
-                $scope.subjectList = data.subjList;\r
-                loadData();\r
-            });\r
-\r
-            $scope.setSubject = function(subject) {\r
-                $scope.selectedSubject = subject;\r
-                loadData();\r
-            };\r
-\r
-            loadData();\r
-    }]);\r
-\r
-    gbp.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
-        function ($scope, JointGraphFactory, TopologyDataLoaders, GBPEpgServices, JointGraphOffsetFactory, GBPConstants) {\r
-            var paper = JointGraphFactory.createGraph(),\r
-                epgItem = {},\r
-                epItems = {};\r
-\r
-            $scope.epgDisplayLabel = ['name', 'id'];\r
-            $scope.epgList = [];\r
-            $scope.selectedEpg = null;\r
-\r
-            $scope.$on('SET_SELECTED_EPG', function(event, epg){\r
-                $scope.selectedEpg = epg.ep;\r
-                $scope.epgList = epg.epList;\r
-                loadData();\r
-            });\r
-\r
-            $scope.setEpg = function(epg){\r
-                selectedEpg = epg;\r
-                loadData();\r
-            };\r
-\r
-            paper.on('cell:pointerdown', function(cell) { \r
-                var objClickAction = {\r
-                    ep: function(data){\r
-                        $scope.setViewContent('ep-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                    },\r
-                    epg: function(data){\r
-                        $scope.setViewContent('epg-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');\r
-                    },\r
-                };\r
-\r
-                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {\r
-                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);\r
-                }\r
-            });\r
-\r
-            var loadData = function() {\r
-                if($scope.selectedTenant && $scope.selectedEpg) {\r
-                    epgItem = {};\r
-                    epItems = {};\r
-                    links = [];\r
-\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-\r
-                    TopologyDataLoaders.getEndpointsFromEndpointGroup($scope.selectedTenant.id, $scope.selectedEpg.id, function(data){\r
-                       var offsetObj = {\r
-                            ow: 100,\r
-                            oh: 100,\r
-                            w: 100,\r
-                            h: 100\r
-                            },\r
-                            marginObj = {\r
-                                w: 50,\r
-                                h: 80\r
-                            };\r
-\r
-                        var label = $scope.selectedEpg.name || $scope.selectedEpg.id,\r
-                            width = JointGraphFactory.getLabelLength(label.length);\r
-                            epgItem = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, 'epg', $scope.selectedEpg, 'Click to see epg info', GBPConstants.colors.graph['subject'], 'EPG');\r
-\r
-                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper);\r
-                        JointGraphFactory.addItem(paper.model, epgItem);\r
-\r
-                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 500);\r
-                        if(data && data.output && data.output['ui-endpoint'] && data.output['ui-endpoint'].length){\r
-                            data.output['ui-endpoint'].forEach(function(ep, i){\r
-                                var label = ep['mac-address'] + ':' + ep['l2-context'],\r
-                                    width = JointGraphFactory.getLabelLength(label.length);\r
-                                    item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, 'ep', ep, 'Click to see ep info', GBPConstants.colors.graph['pns'], 'Endpoint');\r
-\r
-                                JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper);\r
-                                JointGraphFactory.addItem(paper.model, item);\r
-                                epItems[label] = item;\r
-                                links.push(JointGraphFactory.createLink(item.id, epgItem.id, 'green'));\r
-                            });\r
-\r
-                            JointGraphFactory.addItemList(paper.model, links);\r
-                        }\r
-                    }, function(){});\r
-                }\r
-            };\r
-\r
-            $scope.getPaperObj = function(){\r
-                return paper;\r
-            };\r
-\r
-            // init();\r
-    }]);\r
-\r
-    gbp.register.controller('policyRendererCtrl', ['$scope', '$http', '$timeout', 'PGNServices', 'TopoServices', 'GBPTenantServices', 'GBPConstants', 'JointGraphFactory','GBPJointGraphBuilder',\r
-        function ($scope, $http, $timeout, PGNServices, TopoServices, GBPTenantServices, GBPConstants, JointGraphFactory, GBPJointGraphBuilder) {\r
-            \r
-            $scope.topologyData = { nodes: [], links: [] };\r
-            $scope.topologyType = null;\r
-            $scope.topologyArgs = {};\r
-            $scope.legend = {};\r
-            $scope.showLegend = false;\r
-\r
-            var paper = JointGraphFactory.createGraph();\r
-\r
-            var reloadShowLegend = function() {\r
-                $scope.showLegend = !$.isEmptyObject($scope.legend);\r
-            };\r
-\r
-            $scope.settingsSigma = {\r
-                defaultLabelColor: '#fff',\r
-                doubleClickEnabled: false,\r
-                labelThreshold: 8\r
-            };\r
-\r
-            $scope.settingsAtlas = {\r
-                adjustSizes: true,\r
-                gravity: 0.2\r
-            };\r
-\r
-            $scope.viewTopo = {\r
-                box: false,\r
-                button: false\r
-            };\r
-\r
-            paper.on('cell:pointerdown', function(cellView, evt) {\r
-                if (cellView.model.isLink() && cellView.model.attributes.objData) {\r
-                    $scope.$broadcast('SET_LINK_DATA', cellView.model.attributes.objData);\r
-                }\r
-            });\r
-\r
-            $scope.mandatoryProperties = [];\r
-            $scope.loadTopology = function(type, args) {\r
-                if ($scope.selectedTenant) {\r
-                    $scope.topologyType = type;\r
-                    $scope.topologyArgs = args;\r
-                    GBPJointGraphBuilder.loadTopology(args, paper, type);\r
-                }\r
-            };\r
-            $scope.toggleExpanded = function(expand, show) {\r
-                $scope.setViewExpand('policyRendererView',expand, show, 'l2');\r
-\r
-                if($scope.policyRendererView[expand] && $scope.selectedTenant) {\r
-                    $scope.topologyArgs.tenantId = $scope.selectedTenant.id;\r
-\r
-                    if((expand === 'epg' || expand === 'contracts' || expand === 'classifiers' || expand === 'actions' || expand === 'renderers') && ($scope.topologyType !== GBPConstants.strings.config)) {\r
-                        $scope.loadTopology(GBPConstants.strings.config, $scope.topologyArgs);\r
-                    } else if((expand === 'l2l3' || expand === 'registerEndpoint' || expand === 'registerL3PrefixEndpoint') && ($scope.topologyType !== GBPConstants.strings.l2l3)) {\r
-                        $scope.loadTopology(GBPConstants.strings.l2l3, $scope.topologyArgs);\r
-                    }\r
-                }\r
-            };\r
-\r
-            $scope.reloadTopo = function() {\r
-                if($scope.selectedTenant) {\r
-                    $scope.topologyArgs.tenantId = $scope.selectedTenant.id;\r
-                    GBPJointGraphBuilder.loadTopology($scope.topologyArgs, paper, $scope.topologyType);\r
-                }\r
-            };\r
-\r
-            $scope.getDisplayLabelsFromCtrl = function(eventName, val) {\r
-                $scope.$broadcast(eventName, val);\r
-            };\r
-\r
-            $scope.validateMandatory = function(newObj, mandatoryProps){\r
-                var ret = true,\r
-                    notFilledProps = [];\r
-\r
-                mandatoryProps.forEach(function(el){\r
-                    if(newObj[el] === '' || newObj[el] === null || newObj[el] === undefined){\r
-                        notFilledProps.push(el);\r
-                        ret = false;\r
-                    }\r
-                });\r
-\r
-                return {'status' : ret, 'notFilledProps' : notFilledProps};\r
-            };\r
-\r
-            $scope.validate = function(value, errors){\r
-                errors.int32 = !(parseInt(value) >= -2147483648 && parseInt(value) <= 2147483647);\r
-            };\r
-\r
-            \r
-\r
-            $scope.validateForm = function(form) {\r
-                return form.$valid;\r
-            };\r
-          \r
-            $scope.$on('GBP_TENANT_RELOAD', function(e, obj){\r
-                $scope.selectedTenant = obj;\r
-            });\r
-\r
-    }]);\r
-\r
-    gbp.register.controller('linkDataCtrl',['$scope', function($scope){\r
-        $scope.showTable = false;\r
-\r
-        $scope.show = function(){\r
-            $scope.showTable = true;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.showTable = false;\r
-        };\r
-        \r
-        $scope.$on('SET_LINK_DATA', function(e, obj){\r
-           $scope.linkData = obj;\r
-           $scope.show();\r
-           $scope.$apply();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('crudCtrl',['$scope',  function($scope){\r
-        $scope.selectedObj = null;\r
-        $scope.label = '';\r
-        $scope.q = {};\r
-\r
-        $scope.add = function() {\r
-            $scope.selectedObj = null;\r
-            $scope.showForm();\r
-        };\r
-\r
-        $scope.modify = function() {\r
-            $scope.$emit('PGN_EDIT_ELEM');\r
-        };\r
-\r
-        $scope.init = function(label) {\r
-            $scope.label = label;\r
-        };\r
-\r
-\r
-        $scope.$on('EV_SET_SEL_CLASS', function(event, selObj){\r
-            $scope.selectedObj = selObj;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('contractCtrl', ['$scope','GBPContractServices', '$filter', function($scope, GBPContractServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedContract = null;\r
-        $scope.newContractObj = GBPContractServices.createObj();\r
-        $scope.displayLabel = ['description','id'];\r
-        $scope.crudLabel = 'Contract list';\r
-\r
-        $scope.internalView = {\r
-            contract: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-            mandatoryProperties = [],\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.internalView = {\r
-                    contract: false,\r
-                    edit: "view"\r
-                };\r
-                $scope.selectedContract = null;\r
-                $scope.newContractObj = GBPContractServices.createObj();\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                $scope.selectedContract = null;\r
-                path = GBPContractServices.createPathObj($scope.selectedTenant.id);\r
-                \r
-                GBPContractServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    // $scope.$broadcast('GBP_CONTRACT_RELOAD');\r
-                    $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD');\r
-                }, function(){\r
-\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            var resp = $scope.validateMandatory($scope.newContractObj, mandatoryProperties);\r
-            if(resp.status){\r
-                path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.newContractObj.id);\r
-                GBPContractServices.send(path, $scope.newContractObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.contract = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                alert($filter('translate')('GBP_MANDATORY_NOT_FILLED')+': '+resp.notFilledProps.join(', '));\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if ( $scope.selectedContract ) {\r
-                path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id);\r
-                GBPContractServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.selectedContract = null;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newContractObj = GBPContractServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedContract = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.contract = true;\r
-            }else {\r
-                $scope.internalView.contract = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.contract) {\r
-                angular.copy(selectedObj, $scope.newContractObj);\r
-            }\r
-            $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.contract = true;\r
-            $scope.selectedContract = null;\r
-            $scope.internalView.edit = "add";\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.contract = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if(!event.defaultPrevented) {\r
-                if ( $scope.selectedContract ) {\r
-                    $scope.internalView.contract = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedContract, $scope.newContractObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(event){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_CONTRACTS_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('clauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', \r
-        function($scope, GBPClauseServices, GBPSubjectServices){\r
-        $scope.list = [];\r
-        $scope.selectedClause = null;\r
-        $scope.newClauseObj = GBPClauseServices.createObj();\r
-        $scope.internalView = {\r
-            clause: false,\r
-            edit: "view"\r
-        };\r
-        $scope.displayLabel = 'name';\r
-        $scope.crudLabel = 'Clause list';\r
-\r
-        $scope.subjects = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects);\r
-\r
-        var path = null,\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedClause = null;\r
-                $scope.newClauseObj = GBPClauseServices.createObj();\r
-                $scope.internalView = {\r
-                    clause: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        //move to separate ctrl \/\r
-        $scope.addNewElem = function(templateObj) {\r
-            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {\r
-                var objToPush = templateObj || "";\r
-                $scope.newClauseObj['subject-refs'].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {\r
-                $scope.newClauseObj['subject-refs'].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.updateAt = function(index, value) {\r
-            if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) {\r
-                $scope.newClauseObj['subject-refs'][index] = value;\r
-            }\r
-        };\r
-        //move to separate ctrl /\\r
-\r
-        var loadSubjects = function() {\r
-            $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects);\r
-\r
-            GBPSubjectServices.load(path, function(data){\r
-                $scope.subjects.options = data;\r
-            }, function(){\r
-                //TODO: error cbk\r
-            });\r
-        };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedContract ) {\r
-                path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id);\r
-                \r
-                GBPClauseServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.clauseForm)){\r
-                path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newClauseObj.name);\r
-                GBPClauseServices.send(path, $scope.newClauseObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.clause = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.clause = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if ( $scope.selectedClause ) {\r
-                path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedClause.name);\r
-                GBPClauseServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.selectedClause = null;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newClauseObj = GBPClauseServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedClause = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.clause = true;\r
-            }else {\r
-                $scope.internalView.clause = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-            \r
-            if($scope.internalView.clause) {\r
-                angular.copy(selectedObj, $scope.newClauseObj);\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.clause = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedClause = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.clause = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedClause ) {\r
-                    $scope.internalView.clause = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedClause, $scope.newClauseObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_CONTRACT_RELOAD',function(){\r
-            $scope.internalView.clause = false;\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_SUBJECT_RELOAD',function(){\r
-            loadSubjects();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('subjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedSubject = null;\r
-        $scope.newSubjectObj = GBPSubjectServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            subject : false,\r
-            edit : "view"\r
-        };\r
-        $scope.crudLabel = 'Subject list';\r
-        $scope.errors = {};\r
-\r
-        var path = null,\r
-            mandatoryProperties = ['order'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedSubject = null;\r
-                $scope.newSubjectObj = GBPSubjectServices.createObj();\r
-                $scope.internalView = {\r
-                    subject : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedContract ) {\r
-                $scope.selectedSubject = null;\r
-                path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id);\r
-                \r
-                GBPSubjectServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.subjectForm)){\r
-                path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newSubjectObj.name);\r
-                GBPSubjectServices.send(path, $scope.newSubjectObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.subject = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if ( $scope.selectedSubject ) {\r
-                path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name);\r
-                GBPSubjectServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.selectedSubject = null;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newSubjectObj = GBPSubjectServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedSubject = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.subject = true;\r
-            }else {\r
-                $scope.internalView.subject = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.subject) {\r
-                angular.copy(selectedObj, $scope.newSubjectObj);\r
-            }\r
-            $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.subject = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedSubject = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.subject = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedSubject ) {\r
-                    $scope.internalView.subject = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedSubject, $scope.newSubjectObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_CONTRACT_RELOAD',function(){\r
-            $scope.internalView.subject = false;\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('ruleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedRule = null;\r
-        $scope.newRuleObj = GBPRuleServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            rule : false,\r
-            edit : "view"\r
-        };\r
-        $scope.crudLabel = 'Rule list';\r
-        $scope.errors = {};\r
-\r
-        var path = null,\r
-            mandatoryProperties = ['order'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedRule = null;\r
-                $scope.newRuleObj = GBPRuleServices.createObj();\r
-                $scope.internalView = {\r
-                    rule : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedSubject ) {\r
-                $scope.selectedRule = null;\r
-                path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name);\r
-                \r
-                GBPRuleServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.rulesForm)){\r
-                path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.newRuleObj.name);\r
-                GBPRuleServices.send(path, $scope.newRuleObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.rule = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if ( $scope.selectedRule ) {\r
-                path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name);\r
-                GBPRuleServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.selectedRule = null;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newRuleObj = GBPRuleServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedRule = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.rule = true;\r
-            }else {\r
-                $scope.internalView.rule = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.rule) {\r
-                angular.copy(selectedObj, $scope.newRuleObj);\r
-            }\r
-            $scope.$broadcast('GBP_RULE_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.rule = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedRule = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.rule = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedRule ) {\r
-                $scope.internalView.rule = true;\r
-                $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedRule, $scope.newRuleObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_SUBJECT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('actionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedActionRef = null;\r
-        $scope.newActionRefObj = GBPActionRefsServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            actionRef : false,\r
-            edit : "view"\r
-        };\r
-        $scope.crudLabel = 'Action ref list';\r
-        $scope.errors = {};\r
-\r
-        $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel};\r
-\r
-        var path = null,\r
-            mandatoryProperties = ['order'],\r
-\r
-            actionInstanceNamesLoad = function() {\r
-                var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);\r
-                GBPActionInstanceServices.load(actionInstancePath, function(data){\r
-                    $scope.actionInstanceNames.options = data;\r
-                },function(){\r
-                    //TODO: error cbk\r
-                });\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedActionRef = null;\r
-                $scope.newActionRefObj = GBPActionRefsServices.createObj();\r
-                $scope.internalView = {\r
-                    actionRef : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedRule ) {\r
-                $scope.selectedActionRef = null;\r
-                path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name);\r
-                \r
-                GBPActionRefsServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-\r
-                actionInstanceNamesLoad();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.actionRefForm)){\r
-                path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newActionRefObj.name);\r
-                GBPActionRefsServices.send(path, $scope.newActionRefObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.actionRef = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if ( $scope.selectedActionRef ) {\r
-                path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedActionRef.name);\r
-                GBPActionRefsServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.selectedActionRef = null;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newActionRefObj = GBPActionRefsServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedActionRef = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.actionRef = true;\r
-            }else {\r
-                $scope.internalView.actionRef = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.actionRef) {\r
-                angular.copy(selectedObj, $scope.newActionRefObj);\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.actionRef = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedActionRef = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.actionRef = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedActionRef ) {\r
-                    $scope.internalView.actionRef = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedActionRef, $scope.newActionRefObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_RULE_RELOAD',function(){\r
-            $scope.internalView.actionRef = false;\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_ACTION_INSTANCE_RELOAD',function(){\r
-            actionInstanceNamesLoad();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('classifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedClassifierRef = null;\r
-        $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            classifierRef : false,\r
-            edit : "view"\r
-        };\r
-\r
-        $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel};\r
-\r
-        $scope.formDirections = ['in', 'out', 'bidirectional'];\r
-        $scope.formConnectionTracking = ['normal', 'reflexive'];\r
-\r
-        $scope.crudLabel = 'Classifier ref list';\r
-\r
-        var path = null,\r
-\r
-            instanceNamesLoad = function() {\r
-                var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id);\r
-                GBPClassifierInstanceServices.load(classifierInstancePath, function(data){\r
-                    $scope.instanceNames.options = data;\r
-                },function(){\r
-                    //TODO: error cbk\r
-                });\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedClassifierRef = null;\r
-                $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();\r
-                $scope.internalView = {\r
-                    classifierRef : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedRule ) {\r
-                $scope.selectedClassifierRef = null;\r
-                path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name);\r
-                \r
-\r
-\r
-                GBPClassifierRefsServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-\r
-                instanceNamesLoad();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.classifierRefForm)){\r
-                path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newClassifierRefObj.name);\r
-                GBPClassifierRefsServices.send(path, $scope.newClassifierRefObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.classifierRef = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if ( $scope.selectedClassifierRef ) {\r
-                path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedClassifierRef.name);\r
-                GBPClassifierRefsServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.selectedClassifierRef = null;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedClassifierRef = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.classifierRef = true;\r
-            }else {\r
-                $scope.internalView.classifierRef = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.classifierRef) {\r
-                angular.copy(selectedObj, $scope.newClassifierRefObj);\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.classifierRef = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedClassifierRef = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.classifierRef = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedClassifierRef ) {\r
-                    $scope.internalView.classifierRef = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_RULE_RELOAD',function(){\r
-            $scope.internalView.classifierRef = false;\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_CLASSIFIER_INSTANCE_RELOAD',function(){\r
-            instanceNamesLoad();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('tenantCtrl', ['$scope', 'GBPTenantServices', '$filter', function($scope, GBPTenantServices, $filter){ \r
-        $scope.list = [];\r
-        $scope.selectedTenantObj = null;\r
-        $scope.newTenantObj = GBPTenantServices.createObj();\r
-        $scope.displayLabel = ['name' , 'id'];\r
-        $scope.crudLabel = 'Tenants list';\r
-\r
-        $scope.view = {\r
-            tenant: false,\r
-            edit: "view"\r
-        };\r
-\r
-        $scope.init = function() {\r
-            GBPTenantServices.load(\r
-                function(data) {\r
-                    $scope.list = data;\r
-                    $scope.newTenantObj = GBPTenantServices.createObj();\r
-                    $scope.selectedTenantObj = null;\r
-                },\r
-                function(){\r
-                    //TODO error\r
-                });\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.tenantForm)){\r
-                path = GBPTenantServices.createPathObj($scope.newTenantObj.id);\r
-                GBPTenantServices.send(path, $scope.newTenantObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.tenant = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-         $scope.delete = function() {\r
-            if($scope.selectedTenantObj) {\r
-                path = GBPTenantServices.createPathObj($scope.selectedTenantObj.id);\r
-\r
-                GBPTenantServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.view.tenant = false;\r
-                    $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedTenantObj = selectedObj;\r
-\r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.tenant = true;\r
-            }\r
-            else {\r
-                $scope.view.tenant = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-\r
-            if ($scope.view.tenant) {\r
-                angular.copy(selectedObj, $scope.newTenantObj);\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newTenantObj = GBPTenantServices.createObj();\r
-            $scope.selectedTenantObj = null;\r
-            $scope.view.tenant = true;\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.tenant = false;\r
-            $scope.view.edit = "view";\r
-        };\r
-\r
-       $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedTenantObj ) {\r
-                    $scope.view.tenant = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedTenantObj, $scope.newTenantObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('epgCtrl',['$scope', 'GBPEpgServices', 'GBPContractServices', '$filter',\r
-        function($scope, GBPEpgServices, GBPContractServices, $filter){\r
-        $scope.selectedEpg = null;\r
-        $scope.newEpgObj = GBPEpgServices.createObj();\r
-        $scope.displayLabel = ['name', 'id'];\r
-        $scope.crudLabel = 'Group list';\r
-\r
-        $scope.igpOpts = ['allow', 'require-contract'];\r
-\r
-        $scope.contracts = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contracts);\r
-\r
-        $scope.list = [];\r
-\r
-        $scope.internalView = {\r
-            epg: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var loadContracts = function() {\r
-                GBPContractServices.load(path, function(data){\r
-                    $scope.contracts.options = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            },\r
-\r
-            mandatoryProperties = ['name'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedEpg = null;\r
-                $scope.newEpgObj = GBPEpgServices.createObj();\r
-                 $scope.internalView = {\r
-                    epg: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ($scope.selectedTenant) {\r
-                path = GBPEpgServices.createPathObj($scope.selectedTenant.id);\r
-                \r
-                GBPEpgServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    // $scope.$broadcast('GBP_EPG_RELOAD');\r
-                    $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-\r
-                loadContracts();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.epgForm)){\r
-                path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.newEpgObj.id);\r
-                GBPEpgServices.send(path, $scope.newEpgObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.epg = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.edit = "view";\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedEpg) {\r
-                path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id);\r
-                GBPEpgServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.epg = false;\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.internalView.epg = true;\r
-            $scope.reloadNewObj();\r
-            $scope.selectedEpg = null;\r
-            $scope.internalView.edit = "add";\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newEpgObj = GBPEpgServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedEpg = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.epg = true;\r
-            }else {\r
-                $scope.internalView.epg = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.epg) {\r
-                angular.copy(selectedObj, $scope.newEpgObj);\r
-            }\r
-            $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD');\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.epg = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEpg ) {\r
-                    $scope.internalView.epg = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedEpg, $scope.newEpgObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_CONTRACT_RELOAD',function(){\r
-            loadContracts();\r
-        });\r
-\r
-        $scope.$on('GBP_EPG_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('cnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){\r
-        $scope.list = [];\r
-        $scope.selectedCNS = null;\r
-        $scope.newCNSObj = GBPConNamedSelServices.createObj();\r
-        $scope.internalView = {\r
-            cns: false,\r
-            edit: "view"\r
-        };\r
-        $scope.displayLabel = 'name';\r
-        $scope.crudLabel = 'Consumer named selectors list';\r
-\r
-        var clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedCNS = null;\r
-                $scope.newCNSObj = GBPConNamedSelServices.createObj();\r
-                $scope.internalView = {\r
-                    cns: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        //move to separate ctrl \/\r
-        $scope.addNewElem = function(templateObj) {\r
-            if($scope.newCNSObj && $scope.newCNSObj.contract) {\r
-                var objToPush = templateObj || "";\r
-                $scope.newCNSObj.contract.push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            if($scope.newCNSObj && $scope.newCNSObj.contract) {\r
-                $scope.newCNSObj.contract.splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.updateAt = function(index, value) {\r
-            if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) {\r
-                $scope.newCNSObj.contract[index] = value;\r
-            }\r
-        };\r
-        //move to separate ctrl /\\r
-\r
-        $scope.init = function() {\r
-            if ($scope.selectedTenant && $scope.selectedEpg) {\r
-                path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id);\r
-\r
-                GBPConNamedSelServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.cnsForm)){\r
-                path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newCNSObj.name);\r
-                GBPConNamedSelServices.send(path, $scope.newCNSObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.cns = false;\r
-                    $scope.internalView.cns = "view";\r
-                    $scope.reloadNewObj();\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedCNS) {\r
-                path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedCNS.name);\r
-                GBPConNamedSelServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.selectedCNS = null;\r
-            $scope.internalView.cns = true;\r
-            $scope.internalView.edit = "add";\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newCNSObj = GBPConNamedSelServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedCNS = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.cns = true;\r
-            }else {\r
-                $scope.internalView.cns = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            if($scope.internalView.cns) {\r
-                angular.copy(selectedObj, $scope.newCNSObj);\r
-            }\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.cns = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEpg ) {\r
-                    $scope.internalView.cns = true;\r
-                    $scope.internalView.edit = "add";\r
-                    angular.copy($scope.selectedCNS, $scope.newCNSObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_EPG_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('pnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){\r
-        $scope.list = [];\r
-        $scope.selectedPNS = null;\r
-        $scope.newPNSObj = GBPProNamedSelServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.crudLabel = 'Provider named selectors list';\r
-        $scope.internalView = {\r
-            pns: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedPNS = null;\r
-                $scope.newPNSObj = GBPProNamedSelServices.createObj();\r
-                $scope.internalView = {\r
-                    pns: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        //move to separate ctrl \/\r
-        $scope.addNewElem = function(templateObj) {\r
-            if($scope.newPNSObj && $scope.newPNSObj.contract) {\r
-                var objToPush = templateObj || "";\r
-                $scope.newPNSObj.contract.push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            if($scope.newPNSObj && $scope.newPNSObj.contract) {\r
-                $scope.newPNSObj.contract.splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.updateAt = function(index, value) {\r
-            if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) {\r
-                $scope.newPNSObj.contract[index] = value;\r
-            }\r
-        };\r
-        //move to separate ctrl /\\r
-\r
-        $scope.init = function() {\r
-            if ($scope.selectedTenant && $scope.selectedEpg) {\r
-                path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id);\r
-                \r
-                GBPProNamedSelServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.pnsForm)){\r
-                path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newPNSObj.name);\r
-                GBPProNamedSelServices.send(path, $scope.newPNSObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.pns = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.internalView.cns = "view";\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedPNS) {\r
-                path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedPNS.name);\r
-                GBPProNamedSelServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.pns = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedPNS = null;\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newPNSObj = GBPProNamedSelServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedPNS = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.pns = true;\r
-            }else {\r
-                $scope.internalView.pns = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-            \r
-            if($scope.internalView.pns) {\r
-                angular.copy(selectedObj, $scope.newPNSObj);\r
-            }\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.pns = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEpg ) {\r
-                    $scope.internalView.pns = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedPNS, $scope.newPNSObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_EPG_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('l2FloodCtrl', ['$scope', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter', function($scope, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){ \r
-        $scope.list = [];\r
-        $scope.selectedL2Flood = null;\r
-        $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();\r
-        $scope.displayLabel = ['name', 'id'];\r
-        $scope.crudLabel = 'L2 Flood Domain list';\r
-\r
-        $scope.l2bridge = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L2BRIDGE_LABEL', $scope.l2bridge);\r
-\r
-        $scope.view = {\r
-            l2flood: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-\r
-            loadL2BridgeList = function() {\r
-                GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(data){\r
-                    $scope.l2bridge.options = data;\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedL2Flood = null;\r
-                $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();\r
-                $scope.view = {\r
-                    l2flood: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id);\r
-                \r
-                GBPL2FloodDomainServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    // clear objects\r
-                    $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();\r
-                    $scope.selectedL2Flood = null;\r
-                }, function(){\r
-\r
-                });\r
-\r
-                loadL2BridgeList();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.l2FloodForm)){\r
-                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2FloodObj.id);\r
-                GBPL2FloodDomainServices.send(path, $scope.newL2FloodObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.l2flood = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD');\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedL2Flood) {\r
-                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Flood.id);\r
-                GBPL2FloodDomainServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.view.l2flood = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD');\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedL2Flood = selectedObj;\r
-\r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.l2flood = true;\r
-            }\r
-            else {\r
-                $scope.view.l2flood = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-\r
-            if ($scope.view.l2flood) {\r
-                angular.copy(selectedObj, $scope.newL2FloodObj);\r
-            }\r
-\r
-            $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();\r
-            $scope.selectedL2Flood = null;\r
-            $scope.view.l2flood = true;\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.l2flood = false;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedL2Flood ) {\r
-                    $scope.view.l2flood = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedL2Flood, $scope.newL2FloodObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){\r
-            loadL2BridgeList();\r
-        });\r
-\r
-        $scope.$on('GBP_L2FLOOD_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('l2BridgeCtrl', ['$scope', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ \r
-        $scope.list = [];\r
-        $scope.selectedL2Bridge = null;\r
-        $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();\r
-        $scope.displayLabel = ['name', 'id'];\r
-        $scope.crudLabel = 'L2 Bridge Domain list';\r
-\r
-        $scope.l3context = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context);\r
-\r
-        $scope.view = {\r
-            l2bridge: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-\r
-            loadL3ContextList = function() {\r
-                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){\r
-                    $scope.l3context.options = data;\r
-                    //$scope.$broadcast('GBP_L2BRIDGE_RELOAD');\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedL2Bridge = null;\r
-                $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();\r
-                $scope.view = {\r
-                    l2bridge: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id);\r
-                \r
-                GBPL2BridgeDomainServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();\r
-                    $scope.selectedL2Bridge = null;\r
-                    // $scope.$broadcast('GBP_L2BRIDGE_RELOAD');\r
-                }, function(){\r
-\r
-                });\r
-\r
-                loadL3ContextList();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.l2BridgeForm)){\r
-                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2BridgeObj.id);\r
-                GBPL2BridgeDomainServices.send(path, $scope.newL2BridgeObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.l2bridge = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedL2Bridge) {\r
-                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Bridge.id);\r
-                GBPL2BridgeDomainServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.view.l2bridge = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedL2Bridge = selectedObj;\r
-\r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.l2bridge = true;\r
-            }\r
-            else {\r
-                $scope.view.l2bridge = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-\r
-            if ($scope.view.l2bridge) {\r
-                angular.copy(selectedObj, $scope.newL2BridgeObj);\r
-            }\r
-\r
-            $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();\r
-            $scope.selectedL2Bridge = null;\r
-            $scope.view.l2bridge = true;\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.l2bridge = false;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedL2Bridge ) {\r
-                    $scope.view.l2bridge = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedL2Bridge, $scope.newL2BridgeObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){\r
-            loadL3ContextList();\r
-        });\r
-\r
-        $scope.$on('GBP_L2BRIDGE_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('l3ContextCtrl', ['$scope', 'GBPL3ContextServices', '$filter', function($scope, GBPL3ContextServices, $filter){ //GBPContractServices\r
-        $scope.list = [];\r
-        $scope.selectedL3Context = null;\r
-        $scope.newL3ContextObj = GBPL3ContextServices.createObj();\r
-        $scope.displayLabel = ['name', 'id'];\r
-        $scope.crudLabel = 'L3 Context list';\r
-\r
-        $scope.view = {\r
-            l3context: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.view = {\r
-                    l3context: false,\r
-                    edit: "view"\r
-                };\r
-                $scope.selectedL3Context = null;\r
-                $scope.newL3ContextObj = GBPL3ContextServices.createObj();\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id);\r
-                \r
-                GBPL3ContextServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.newL3ContextObj = GBPL3ContextServices.createObj();\r
-                    $scope.selectedL3Context = null;\r
-                }, function(){\r
-\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-             if($scope.validateForm($scope.l3ContextForm)){\r
-                path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.newL3ContextObj.id);\r
-                GBPL3ContextServices.send(path, $scope.newL3ContextObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.l3context = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD');\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedL3Context) {\r
-                path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.selectedL3Context.id);\r
-                GBPL3ContextServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.view.l3context = false;\r
-                    $scope.view.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD');\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedL3Context = selectedObj;\r
-            \r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.l3context = true;\r
-            }\r
-            else {\r
-                $scope.view.l3context = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-\r
-            if($scope.view.l3context) {\r
-                angular.copy(selectedObj, $scope.newL3ContextObj);\r
-            }\r
-\r
-            $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newL3ContextObj = GBPL3ContextServices.createObj();\r
-            $scope.selectedL3Context = null;\r
-            $scope.view.l3context = true;\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.l3context = false;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedL3Context ) {\r
-                    $scope.view.l3context = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedL3Context, $scope.newL3ContextObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_L3CONTEXT_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('subnetCtrl', ['$scope', 'GBPSubnetServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPSubnetServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ \r
-        $scope.list = [];\r
-        $scope.selectedSubnet = null;\r
-        $scope.newSubnetObj = GBPSubnetServices.createObj();\r
-        $scope.displayLabel = ['name', 'id'];\r
-        $scope.crudLabel = 'Subnet list';\r
-\r
-        $scope.l2L3List = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2L3List);\r
-\r
-        $scope.view = {\r
-            subnet: false,\r
-            edit: "view"\r
-        };\r
-\r
-\r
-        var path = null,\r
-\r
-            loadL2L3List = function() {\r
-                $scope.l2L3List.options = [];\r
-\r
-                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(l3ContextData){\r
-                    $scope.l2L3List.options = $scope.l2L3List.options.concat(l3ContextData);\r
-                }, function(){\r
-\r
-                });\r
-\r
-                GBPL2FloodDomainServices.load(GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id), function(l2FloodData){\r
-                    $scope.l2L3List.options = $scope.l2L3List.options.concat(l2FloodData);\r
-                }, function(){\r
-\r
-                });\r
-\r
-                GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(l2BridgeData){\r
-                    $scope.l2L3List.options = $scope.l2L3List.options.concat(l2BridgeData);\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.view = {\r
-                    subnet: false,\r
-                    edit: "view"\r
-                };\r
-                $scope.selectedSubnet = null;\r
-                $scope.newSubnetObj = GBPSubnetServices.createObj();\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                path = GBPSubnetServices.createPathObj($scope.selectedTenant.id);\r
-                \r
-                GBPSubnetServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.newSubnetObj = GBPSubnetServices.createObj();\r
-                    $scope.selectedSubnet = null;\r
-\r
-                    $scope.view.subnet = false;\r
-                    $scope.view.edit = "view";\r
-                    //$scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');\r
-                }, function(){\r
-\r
-                });\r
-\r
-                loadL2L3List();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-           if($scope.validateForm($scope.subnetForm)){\r
-                path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.newSubnetObj.id);\r
-                GBPSubnetServices.send(path, $scope.newSubnetObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.subnet = false;\r
-                    $scope.view.edit = "view";\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedSubnet) {\r
-                path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id);\r
-                GBPSubnetServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.view.subnet = false;\r
-                    $scope.view.edit = "view";\r
-\r
-                    $scope.reloadTopo();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedSubnet = selectedObj;\r
-            \r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.subnet = true;\r
-            }\r
-            else {\r
-                $scope.view.subnet = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-\r
-            if($scope.view.subnet) {\r
-                angular.copy(selectedObj, $scope.newSubnetObj);\r
-            }\r
-\r
-            $scope.sendReloadEventFromRoot('GBP_SUBNET_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newSubnetObj = GBPSubnetServices.createObj();\r
-            $scope.selectedSubnet = null;\r
-            $scope.view.subnet = true;\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.subnet = false;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedSubnet ) {\r
-                    $scope.view.subnet = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedSubnet, $scope.newSubnetObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_GATEWAY_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-        \r
-        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){\r
-            loadL2L3List();\r
-        });\r
-\r
-        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){\r
-            loadL2L3List();\r
-        });\r
-\r
-        $scope.$on('GBP_L2FLOOD_RELOAD',function(){\r
-            loadL2L3List();\r
-        });\r
-\r
-        $scope.$on('GBP_PREFIX_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('gatewayCtrl', ['$scope', 'GBPGatewayServices', function($scope, GBPGatewayServices){ \r
-        $scope.list = [];\r
-        $scope.gatewayView = false;\r
-        $scope.selectedGateway = null;\r
-        $scope.newGatewayObj = GBPGatewayServices.createObj();\r
-        $scope.displayLabel = 'gateway';\r
-        $scope.crudLabel = 'Gateway list';\r
-        $scope.internalView = {\r
-            gateway: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.gatewayView = false;\r
-                $scope.selectedGateway = null;\r
-                $scope.newGatewayObj = GBPGatewayServices.createObj();\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant && $scope.selectedSubnet ) {\r
-                path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id);\r
-                \r
-                GBPGatewayServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.newGatewayObj = GBPGatewayServices.createObj();\r
-                    $scope.internalView.gateway = false;\r
-                    $scope.selectedGateway = null;\r
-                }, function(){\r
-\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.gatewayForm)){\r
-                path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.newGatewayObj.gateway);\r
-                GBPGatewayServices.send(path, $scope.newGatewayObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.gateway = false;\r
-                    $scope.internalView.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) {\r
-                path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway);\r
-                GBPGatewayServices.delete(path, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.gateway = false;\r
-                    $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedGateway = selectedObj;\r
-            angular.copy(selectedObj, $scope.newGatewayObj);\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.gateway = true;\r
-            }else {\r
-                $scope.internalView.gateway = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            $scope.sendReloadEventFromRoot('GBP_GATEWAY_SET');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newGatewayObj = GBPGatewayServices.createObj();\r
-            $scope.internalView.gateway = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedGateway = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.gateway = false;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedGateway ) {\r
-                    $scope.internalView.gateway = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedGateway, $scope.newGatewayObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_SUBNET_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_PREFIX_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('prefixCtrl', ['$scope', 'GBPPrefixServices', function($scope, GBPPrefixServices){ \r
-        $scope.list = [];\r
-        $scope.selectedPrefix = null;\r
-        $scope.newPrefixObj = GBPPrefixServices.createObj();\r
-        $scope.displayLabel = 'prefix';\r
-        $scope.crudLabel = 'Prefix list';\r
-        $scope.internalView = {\r
-            prefix: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedPrefix = null;\r
-                $scope.newPrefixObj = GBPPrefixServices.createObj();\r
-                $scope.internalView = {\r
-                    prefix: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) {\r
-                path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway);\r
-                \r
-                GBPPrefixServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.newPrefixObj = GBPPrefixServices.createObj();\r
-                    $scope.internalView.prefix = false;\r
-                    $scope.selectedPrefix = null;\r
-                }, function(){\r
-\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.prefixForm)){\r
-                path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.newPrefixObj.prefix);\r
-                GBPPrefixServices.send(path, $scope.newPrefixObj, function(data){\r
-                    $scope.init();\r
-                    $scope.internalView.prefix = false;\r
-                    $scope.internalView.edit = "view";\r
-                    $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.selectedPrefix.prefix);\r
-            GBPPrefixServices.delete(path, function(data){\r
-                $scope.init();\r
-                $scope.internalView.prefix = false;\r
-                $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD');\r
-            }, function(){\r
-                //TODO: error cbk\r
-            });\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedPrefix = selectedObj;\r
-            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";\r
-            if(selectedObj){\r
-                $scope.internalView.prefix = true;\r
-            }else {\r
-                $scope.internalView.prefix = false;\r
-                $scope.internalView.edit = "view";\r
-            }\r
-\r
-            angular.copy(selectedObj, $scope.newPrefixObj);\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newPrefixObj = GBPPrefixServices.createObj();\r
-            $scope.internalView.prefix = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedPrefix = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.prefix = false;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedPrefix ) {\r
-                    $scope.internalView.prefix = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedPrefix, $scope.newPrefixObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_GATEWAY_SET',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('renderersCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ //GBPContractServices\r
-        $scope.classifierDefinitions = {'options' : [], 'labels' : null};\r
-        $scope.actionDefinitions = {'options' : [], 'labels' : null};\r
-\r
-        //reload on event?\r
-\r
-        var loadDefinitions = function() {\r
-            GPBServices.getDefinitions(function(classifierDefs, actionDefs) {\r
-                $scope.classifierDefinitions.options = classifierDefs;\r
-                $scope.getDisplayLabelsFromCtrl('GBP_CLASSIFIERS_LABEL', $scope.classifierDefinitions);\r
-\r
-                $scope.actionDefinitions.options = actionDefs;\r
-                $scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions);\r
-            });\r
-        };\r
-\r
-        loadDefinitions();\r
-    }]);\r
-\r
-    gbp.register.controller('paramCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){\r
-        $scope.value = null;\r
-\r
-        $scope.init = function(param, paramValues) {\r
-            $scope.parameter = param;\r
-\r
-            if(paramValues) {\r
-                paramValues.forEach(function(p) {\r
-                    if($scope.parameter.name === p.name) {\r
-                        $scope.value = GPBServices.getInstanceParamValue(p);\r
-                    }\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.$on('GBP_SAVE_PARAM', function(event){\r
-            if($scope.value !== '' && $scope.value !== null) {\r
-                $scope.addParam($scope.parameter.name, $scope.parameter.type, $scope.value);\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_SET_PARAM_VALUE', function(event, name, intVal, strVal) {\r
-            //console.info($scope.parameter, ' got GBP_SET_PARAM_VALUE', name, intVal, strVal, event);\r
-            \r
-        });\r
-\r
-        $scope.$on('GBP_RESET_PARAM', function(event){\r
-            $scope.value = null;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('classifiersCtrl', ['$scope', 'GBPClassifierInstanceServices', 'GPBServices', '$filter',\r
-        function($scope, GBPClassifierInstanceServices, GPBServices, $filter){\r
-        $scope.list = [];\r
-        $scope.classifiersView = false;\r
-        $scope.displayLabel = 'name';\r
-        $scope.selectedClassifier = null;\r
-        $scope.crudLabel = 'Classifiers';\r
-        $scope.newClassifierObj = GBPClassifierInstanceServices.createObj();\r
-        $scope.edit = "view";\r
-\r
-        var mandatoryProperties = ['name'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.classifiersView = false;\r
-                $scope.selectedClassifier = null;\r
-                $scope.newClassifierObj = GBPClassifierInstanceServices.createObj();\r
-                $scope.edit = "view";\r
-            };\r
-\r
-        $scope.getDefinitionObjParams = function(id){\r
-            return GPBServices.getDefinitionObjParams($scope.classifierDefinitions.options, id);\r
-        };\r
-\r
-        $scope.reloadDefs = function(){\r
-            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newClassifierObj['classifier-definition-id']));\r
-        };\r
-\r
-        $scope.addParam = function(name, type, value) {\r
-            $scope.newClassifierObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));\r
-        };\r
-\r
-        var saveParams = function() {\r
-            $scope.newClassifierObj['parameter-value'] = [];\r
-            $scope.$broadcast('GBP_SAVE_PARAM');\r
-        };\r
-\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id);\r
-                GBPClassifierInstanceServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.reloadDefs();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.classifierForm)){\r
-                path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newClassifierObj.name);\r
-                saveParams();\r
-                GBPClassifierInstanceServices.send(path, $scope.newClassifierObj, function(data){\r
-                    $scope.init();\r
-                    $scope.classifiersView = false;\r
-                    $scope.edit = "view";\r
-                $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newClassifierObj = GBPClassifierInstanceServices.createObj();\r
-            $scope.selectedClassifier = null;\r
-            $scope.classifiersView = true;\r
-            $scope.edit = "add";\r
-            $scope.reloadDefs();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj){\r
-            $scope.selectedClassifier = selectedObj;\r
-            $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD');\r
-\r
-            $scope.edit = $scope.edit == "edit" ? $scope.edit : "view";\r
-            if(selectedObj){\r
-                $scope.classifiersView = true;\r
-            }\r
-            else {\r
-                $scope.classifiersView = false;\r
-                $scope.edit = "view";\r
-            }\r
-\r
-            if($scope.classifiersView) {\r
-                angular.copy(selectedObj, $scope.newClassifierObj);\r
-            }\r
-\r
-            $scope.reloadDefs();\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.classifiersView = false;\r
-            $scope.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedClassifier ) {\r
-                    $scope.classifiersView = true;\r
-                    angular.copy($scope.selectedClassifier, $scope.newClassifierObj);\r
-                    $scope.edit = "edit";\r
-                    $scope.reloadDefs();\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.delete = function(){\r
-            path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedClassifier.name);\r
-            GBPClassifierInstanceServices.delete(path, function(data){\r
-                $scope.init();\r
-                $scope.classifiersView = false;\r
-                $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD');\r
-            }, function(){\r
-                //TODO: error cbk\r
-            });\r
-        };\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_CLASSIFIERS_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('actionsCtrl', ['$scope', 'GBPActionInstanceServices', 'GPBServices', '$filter',\r
-        function($scope, GBPActionInstanceServices, GPBServices, $filter){\r
-        $scope.list = [];\r
-        $scope.actionsView = false;\r
-        $scope.displayLabel = 'name';\r
-        $scope.selectedAction = null;\r
-        $scope.crudLabel = 'Actions';\r
-        $scope.newActionObj = GBPActionInstanceServices.createObj();\r
-        $scope.edit = "view";\r
-\r
-        var mandatoryProperties = ['name'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.actionsView = false;\r
-                $scope.selectedAction = null;\r
-                $scope.newActionObj = GBPActionInstanceServices.createObj();\r
-                $scope.edit = "view";\r
-            };\r
-\r
-        $scope.getDefinitionObjParams = function(id){\r
-            return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id);\r
-        };\r
-\r
-        $scope.reloadDefs = function(){\r
-            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id']));\r
-        };\r
-\r
-        $scope.addParam = function(name, type, value) {\r
-            $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));\r
-        };\r
-\r
-        var saveParams = function() {\r
-            $scope.newActionObj['parameter-value'] = [];\r
-            $scope.$broadcast('GBP_SAVE_PARAM');\r
-        };\r
-\r
-\r
-        $scope.init = function() {\r
-            if ( $scope.selectedTenant ) {\r
-                path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);\r
-                GBPActionInstanceServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                    $scope.reloadDefs();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.actionsForm)){\r
-                path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newActionObj.name);\r
-                saveParams();\r
-\r
-                GBPActionInstanceServices.send(path, $scope.newActionObj, function(data){\r
-                    $scope.init();\r
-                    $scope.actionsView = false;\r
-                    $scope.edit = "view";\r
-                $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.newActionObj = GBPActionInstanceServices.createObj();\r
-            $scope.selectedAction = null;\r
-            $scope.actionsView = true;\r
-            $scope.edit = "add";\r
-            $scope.reloadDefs();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj){\r
-            $scope.selectedAction = selectedObj;\r
-            $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');\r
-\r
-            $scope.edit = $scope.edit == "edit" ? $scope.edit : "view";\r
-            if(selectedObj){\r
-                $scope.actionsView = true;\r
-            }\r
-            else {\r
-                $scope.actionsView = false;\r
-                $scope.edit = "view";\r
-            }\r
-\r
-            if($scope.actionsView) {\r
-                angular.copy(selectedObj, $scope.newActionObj);\r
-            }\r
-\r
-            $scope.reloadDefs();\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.actionsView = false;\r
-            $scope.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedAction ) {\r
-                    $scope.actionsView = true;\r
-                    angular.copy($scope.selectedAction, $scope.newActionObj);\r
-                    $scope.edit = "edit";\r
-                    $scope.reloadDefs();\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.delete = function(){\r
-            path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedAction.name);\r
-            GBPActionInstanceServices.delete(path, function(data){\r
-                $scope.init();\r
-                $scope.actionsView = false;\r
-                $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');\r
-            }, function(){\r
-                //TODO: error cbk\r
-            });\r
-        };\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_ACTIONS_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('endpointCtrl', ['$scope', 'GBPEndpointServices', 'GPBServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', 'GBPEpgServices', '$filter', 'GBPSubnetServices',\r
-        function($scope, GBPEndpointServices, GPBServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, GBPEpgServices, $filter, GBPSubnetServices){\r
-        $scope.list = [];\r
-        $scope.selectedEndpoint = null;\r
-        $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);\r
-        $scope.displayLabel = function(obj) {\r
-            return obj['mac-address'] + ':' + obj['l2-context'];\r
-        };\r
-        $scope.crudLabel = 'Endpoint list';\r
-\r
-        $scope.l2context = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context);\r
-\r
-        $scope.l3context = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context);\r
-\r
-        $scope.subnet = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_SUBNET_LABEL', $scope.subnet);\r
-\r
-        $scope.epg = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg);\r
-\r
-        $scope.networkContainment = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.networkContainment);\r
-\r
-        $scope.view = {\r
-            endpoint: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-            mandatoryProperties = [],\r
-\r
-            loadEpgOptions = function() {\r
-                $scope.epg.options = [];\r
-\r
-                path = GBPEpgServices.createPathObj($scope.selectedTenant.id);\r
-                GBPEpgServices.load(path, function(data){\r
-                    $scope.epg.options = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            },\r
-\r
-            loadL2ContextOptions = function() {\r
-                removeL2ContextOptions($scope.networkContainment.options, $scope.l2context.options);\r
-                $scope.l2context.options = [];\r
-\r
-                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id);\r
-                    \r
-                GBPL2FloodDomainServices.load(path, function(data){\r
-                    $scope.l2context.options = $scope.l2context.options.concat(data);\r
-                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);\r
-                }, function(){\r
-\r
-                });\r
-\r
-                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id);\r
-                GBPL2BridgeDomainServices.load(path, function(data){\r
-                    $scope.l2context.options = $scope.l2context.options.concat(data);\r
-                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            loadL3ContextOptions = function(){\r
-                removeL2ContextOptions($scope.networkContainment.options, $scope.l3context.options);\r
-                $scope.l3context.options = [];\r
-\r
-                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){\r
-                    $scope.l3context.options = data;\r
-                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            loadSubnetOptions = function(){\r
-                $scope.subnet.options = [];\r
-\r
-                GBPSubnetServices.load(GBPSubnetServices.createPathObj($scope.selectedTenant.id), function(data){\r
-                    $scope.subnet.options = data;\r
-                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            loadNetworkCotnaninemnt = function(){\r
-                $scope.networkContainment.options = [];\r
-\r
-                loadL2ContextOptions();\r
-                loadL3ContextOptions();\r
-                loadSubnetOptions();\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedEndpoint = null;\r
-                $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);\r
-                $scope.view = {\r
-                    endpoint: false,\r
-                    edit: "view"\r
-                };\r
-            },\r
-            removeL2ContextOptions = function(arr1, arr2) {\r
-                arr1 = arr1.filter( function( el ) {\r
-                  return arr2.indexOf( el ) < 0;\r
-                });\r
-            };\r
-        \r
-        $scope.init = function() {\r
-            if ($scope.selectedTenant) {\r
-\r
-                GBPEndpointServices.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-\r
-                loadEpgOptions();\r
-                /*loadL2ContextOptions();\r
-                loadL3ContextOptions();\r
-                loadSubnetOptions();*/\r
-                loadNetworkCotnaninemnt();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.addNewL3address = function() {\r
-            if($scope.newEndpointObj) {\r
-                if(!$scope.newEndpointObj['l3-address']){\r
-                    $scope.newEndpointObj['l3-address'] = [];\r
-                }\r
-                var objToPush = {'l3-context' : '', 'ip-address' : ''};\r
-                $scope.newEndpointObj['l3-address'].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteNewL3address = function(index){\r
-            if($scope.newEndpointObj) {\r
-                $scope.newEndpointObj['l3-address'].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.addNewLeafListEl = function(prop) {\r
-            if($scope.newEndpointObj) {\r
-                if(!$scope.newEndpointObj[prop]){\r
-                    $scope.newEndpointObj[prop] = [];\r
-                }\r
-                var objToPush = "";\r
-                $scope.newEndpointObj[prop].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.updateLeafListEl = function(index, value, prop) {\r
-            if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) {\r
-                $scope.newEndpointObj[prop][index] = value;\r
-            }\r
-        };\r
-\r
-        $scope.deleteNewLeafListEl = function(index, prop){\r
-            if($scope.newEndpointObj) {\r
-                $scope.newEndpointObj[prop].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.endpointForm)){\r
-                GBPEndpointServices.send(path, $scope.newEndpointObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.endpoint = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.view.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedEndpoint) {\r
-                GBPEndpointServices.delete(path, $scope.selectedEndpoint, function(data){\r
-                    $scope.init();\r
-                    $scope.view.endpoint = false;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.view.endpoint = true;\r
-            $scope.reloadNewObj();\r
-            $scope.selectedEndpoint = null;\r
-\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedEndpoint = selectedObj;\r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.endpoint = true;\r
-            }\r
-            else {\r
-                $scope.view.endpoint = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-\r
-            if($scope.view.endpoint) {\r
-                angular.copy(selectedObj, $scope.newEndpointObj);\r
-            }\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.endpoint = false;\r
-            $scope.view.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEndpoint ) {\r
-                    $scope.view.endpoint = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedEndpoint, $scope.newEndpointObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_EPG_RELOAD',function(){\r
-            loadEpgOptions();\r
-        });\r
-\r
-        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){\r
-            //loadL2ContextOptions();\r
-            loadNetworkCotnaninemnt();\r
-        });\r
-\r
-        $scope.$on('GBP_L2FLOOD_RELOAD',function(){\r
-            //loadL2ContextOptions();\r
-            loadNetworkCotnaninemnt();\r
-        });\r
-\r
-        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){\r
-            //loadL3ContextOptions();\r
-            loadNetworkCotnaninemnt();\r
-        });\r
-\r
-        $scope.$on('GBP_SUBNET_RELOAD',function(){\r
-            //loadSubnetOptions();\r
-            loadNetworkCotnaninemnt();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('l3EndpointCtrl', ['$scope', 'GBPEndpointL3Services', 'GPBServices', 'GBPEpgServices', 'GBPL3ContextServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter',\r
-        function($scope, GBPEndpointL3Services, GPBServices, GBPEpgServices, GBPL3ContextServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedEndpoint = null;\r
-        $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);\r
-        $scope.displayLabel = function(obj) {\r
-            return obj['ip-prefix'] + ':' + obj['l3-context'];\r
-        };\r
-        $scope.crudLabel = 'L3 Prefix endpoint list';\r
-\r
-        $scope.l2context = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context);\r
-\r
-        $scope.l3context = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context);\r
-\r
-        $scope.epg = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg);\r
-\r
-        $scope.view = {\r
-            endpoint: false,\r
-            edit: "view"\r
-        };\r
-\r
-        var path = null,\r
-            mandatoryProperties = [],\r
-\r
-            loadEpgOptions = function() {\r
-                $scope.epg.options = [];\r
-\r
-                path = GBPEpgServices.createPathObj($scope.selectedTenant.id);\r
-                GBPEpgServices.load(path, function(data){\r
-                    $scope.epg.options = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            },\r
-\r
-            loadL2ContextOptions = function() {\r
-                $scope.l2context.options = [];\r
-\r
-                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id);\r
-                    \r
-                GBPL2FloodDomainServices.load(path, function(data){\r
-                    $scope.l2context.options = $scope.l2context.options.concat(data);\r
-                }, function(){\r
-\r
-                });\r
-\r
-                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id);\r
-                GBPL2BridgeDomainServices.load(path, function(data){\r
-                    $scope.l2context.options = $scope.l2context.options.concat(data);\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            loadL3ContextOptions = function(){\r
-                $scope.l3context.options = [];\r
-\r
-                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){\r
-                    $scope.l3context.options = data;\r
-                }, function(){\r
-\r
-                });\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedEndpoint = null;\r
-                $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);\r
-                $scope.view = {\r
-                    endpoint: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-        \r
-        $scope.init = function() {\r
-            if ($scope.selectedTenant) {\r
-\r
-                GBPEndpointL3Services.load(path, function(data){\r
-                    $scope.list = data;\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-\r
-                loadEpgOptions();\r
-                loadL2ContextOptions();\r
-                loadL3ContextOptions();\r
-            }else{\r
-                clear();\r
-            }\r
-        };\r
-\r
-        $scope.addNewL2gateways = function() {\r
-            if($scope.newEndpointObj) {\r
-                if(!$scope.newEndpointObj['endpoint-l2-gateways']){\r
-                    $scope.newEndpointObj['endpoint-l2-gateways'] = [];\r
-                }\r
-                var objToPush = {'l2-context' : '', 'mac-address' : ''};\r
-                $scope.newEndpointObj['endpoint-l2-gateways'].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteNewL2gateways = function(index){\r
-            if($scope.newEndpointObj) {\r
-                $scope.newEndpointObj['endpoint-l2-gateways'].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.addNewL3gateways = function() {\r
-            if($scope.newEndpointObj) {\r
-                if(!$scope.newEndpointObj['endpoint-l3-gateways']){\r
-                    $scope.newEndpointObj['endpoint-l3-gateways'] = [];\r
-                }\r
-                var objToPush = {'l3-context' : '', 'ip-address' : ''};\r
-                $scope.newEndpointObj['endpoint-l3-gateways'].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteNewL3gateways = function(index){\r
-            if($scope.newEndpointObj) {\r
-                $scope.newEndpointObj['endpoint-l3-gateways'].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.addNewLeafListEl = function(prop) {\r
-            if($scope.newEndpointObj) {\r
-                if(!$scope.newEndpointObj[prop]){\r
-                    $scope.newEndpointObj[prop] = [];\r
-                }\r
-                var objToPush = "";\r
-                $scope.newEndpointObj[prop].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.updateLeafListEl = function(index, value, prop) {\r
-            if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) {\r
-                $scope.newEndpointObj[prop][index] = value;\r
-            }\r
-        };\r
-\r
-        $scope.deleteNewLeafListEl = function(index, prop){\r
-            if($scope.newEndpointObj) {\r
-                $scope.newEndpointObj[prop].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            if($scope.validateForm($scope.l3EndpointForm)){\r
-                GBPEndpointL3Services.send(path, $scope.newEndpointObj, function(data){\r
-                    $scope.init();\r
-                    $scope.view.endpoint = false;\r
-                    $scope.reloadNewObj();\r
-                    $scope.view.edit = "view";\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedTenant && $scope.selectedEndpoint) {\r
-                GBPEndpointL3Services.delete(path, $scope.selectedEndpoint, function(data){\r
-                    $scope.init();\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.view.endpoint = true;\r
-            $scope.reloadNewObj();\r
-            $scope.selectedEndpoint = null;\r
-            $scope.view.edit = "add";\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedEndpoint = selectedObj;\r
-            angular.copy(selectedObj, $scope.newEndpointObj);\r
-            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";\r
-            if(selectedObj){\r
-                $scope.view.endpoint = true;\r
-            }\r
-            else {\r
-                $scope.view.endpoint = false;\r
-                $scope.view.edit = "view";\r
-            }\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.view.endpoint = false;\r
-            $scope.view.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEndpoint ) {\r
-                    $scope.view.endpoint = true;\r
-                    $scope.view.edit = "edit";\r
-                    angular.copy($scope.selectedEndpoint, $scope.newEndpointObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_EPG_RELOAD',function(){\r
-            loadEpgOptions();\r
-        });\r
-\r
-        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){\r
-            loadL2ContextOptions();\r
-        });\r
-\r
-        $scope.$on('GBP_L2FLOOD_RELOAD',function(){\r
-            loadL2ContextOptions();\r
-        });\r
-\r
-        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){\r
-            loadL3ContextOptions();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('accessModelWizardCtrl', ['$scope', '$filter', 'GBPTenantServices', 'GBPEpgServices', 'GBPContractServices', 'GPBServices', function($scope, $filter, GBPTenantServices, GBPEpgServices, GBPContractServices, GPBServices){ \r
-        $scope.wizardPage = null;\r
-\r
-        $scope.selectedTenant = null;\r
-        $scope.tenant = null;\r
-        //$scope.epgList = [];\r
-        $scope.newContractObj = null;\r
-\r
-        $scope.init = function() {\r
-            $scope.setPage('tenants');\r
-        };\r
-\r
-        $scope.setPage = function(pageName, object) {\r
-            $scope.wizardPage = pageName;\r
-\r
-            switch(pageName) {\r
-                case 'contracts':\r
-                    if(object) {\r
-                        $scope.tenant = object;\r
-                    }\r
-\r
-                    break;\r
-\r
-                case 'summary':\r
-                    $scope.tenant['endpoint-group'] = $scope.tenant['endpoint-group'] ? $scope.tenant['endpoint-group'] : [];\r
-\r
-                    if(object) {\r
-                        object.forEach(function(o) {\r
-                            $scope.tenant['endpoint-group'].push(GPBServices.stripNullValues(o));\r
-                        });\r
-                    }\r
-\r
-                    break;\r
-\r
-                 case 'epgs':\r
-                    $scope.tenant['contract'] = $scope.tenant['contract'] ? $scope.tenant['contract'] : [];\r
-\r
-                    if(object) {\r
-                        object.forEach(function(o) {\r
-                            $scope.tenant['contract'].push(GPBServices.stripNullValues(o));\r
-                        });\r
-                    }\r
-\r
-                    break;\r
-            }\r
-        };\r
-\r
-        $scope.submit = function(object) {\r
-            $scope.tenant['endpoint-group'] = $scope.tenant['endpoint-group'] ? $scope.tenant['endpoint-group'] : [];\r
-\r
-            if(object) {\r
-                object.forEach(function(o) {\r
-                    $scope.tenant['endpoint-group'].push(GPBServices.stripNullValues(o));\r
-                });\r
-            }\r
-\r
-            \r
-            path = GBPTenantServices.createPathObj($scope.tenant.id);\r
-            GBPTenantServices.send(path, $scope.tenant, function(data){\r
-                $scope.wizards.accessModelWizard = false;\r
-                $scope.sendReloadEventFromRoot('GBP_GLOBAL_TENANT_RELOAD');\r
-                $scope.reloadTopo();\r
-            }, function(){\r
-                //TODO: error cbk\r
-            });\r
-        };\r
-\r
-        // $scope.updateList = function(list, object, key) {\r
-        //     var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
-\r
-        //     if(elementPos < 0) {\r
-        //         list.push(object);\r
-        //     }\r
-        //     else {\r
-        //         list[elementPos] = object;\r
-        //     }\r
-        // };\r
-    }]);\r
-\r
-    gbp.register.controller('wizardTenantCtrl', ['$scope', '$filter', 'GBPTenantServices', function($scope, $filter, GBPTenantServices){ \r
-        // $scope.tenantList = [];\r
-        $scope.newTenantObj = GBPTenantServices.createObj();\r
-        $scope.displayLabel = ['name' , 'id'];\r
-\r
-        $scope.view = {\r
-            tenantEdit: false\r
-        };\r
-\r
-        // $scope.init = function() {\r
-        //     $scope.getTenants();\r
-        // };\r
-\r
-        // $scope.getTenants = function() {\r
-        //     GBPTenantServices.load(\r
-        //         function(data) {\r
-        //             $scope.tenantList = data;\r
-        //             $scope.newTenantObj = GBPTenantServices.createObj();\r
-        //         },\r
-        //         function(){\r
-        //             //TODO error\r
-        //         }\r
-        //     );\r
-        // };\r
-\r
-        $scope.reloadTenants = function(selectedObject) {\r
-            if(!selectedObject) {\r
-                selectedObject = GBPTenantServices.createObj();\r
-                 $scope.view.tenantEdit = false;\r
-            }\r
-            else {\r
-                $scope.view.tenantEdit = true;\r
-            }\r
-\r
-            $scope.selectedTenant = selectedObject;\r
-            $scope.newTenantObj = selectedObject;\r
-        };\r
-\r
-        $scope.getNewTenantObject = function() {\r
-            return GBPTenantServices.createObj();\r
-        };\r
-    }]); \r
-\r
-    gbp.register.controller('wizardEpgCtrl', ['$scope', '$filter', 'GBPEpgServices', function($scope, $filter, GBPEpgServices){ \r
-        $scope.list = [];\r
-        $scope.newEpgObj = GBPEpgServices.createObj();\r
-        $scope.selectedEpg = null;\r
-        $scope.epgFormView = true;\r
-\r
-        $scope.displayLabel = ['name', 'id'];\r
-        $scope.crudLabel = 'Group list';\r
-\r
-        $scope.igpOpts = ['allow', 'require-contract'];\r
-\r
-        $scope.init = function() {\r
-            \r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.epgFormView = true;\r
-            $scope.newEpgObj = GBPEpgServices.createObj();\r
-        };\r
-\r
-        $scope.save = function() {\r
-            $scope.updateList($scope.list, $scope.newEpgObj, "id");\r
-            $scope.reload($scope.newEpgObj);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newEpgObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedEpg) {\r
-                var index = $scope.list.indexOf($scope.selectedEpg);\r
-                $scope.list.splice(index, 1);\r
-                $scope.epgFormView = false;\r
-            }\r
-            //$scope.newEpgObj = GBPEpgServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedEpg = selectedObj;\r
-            $scope.newEpgObj = selectedObj;\r
-            $scope.epgFormView = true;\r
-            $scope.$broadcast('WIZARD_EPG_RELOAD');\r
-        };\r
-\r
-        $scope.close = function() {\r
-            $scope.epgFormView = false;\r
-            $scope.newEpgObj = GBPEpgServices.createObj();\r
-            $scope.selectedEpg = null;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEpg ) {\r
-                    $scope.epgFormView = true;\r
-                    angular.copy($scope.selectedEpg, $scope.newEpgObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on("WIZARD_CNS_RELOAD", function(event, args){\r
-            //$scope.selectedEpg['consumer-named-selector'] = args;\r
-            $scope.newEpgObj['consumer-named-selector'] = args;\r
-            $scope.updateList($scope.list, $scope.newEpgObj, "id");\r
-        });\r
-\r
-        $scope.$on("WIZARD_PNS_RELOAD", function(event, args){\r
-            //$scope.selectedEpg['provider-named-selector'] = args;\r
-            $scope.newEpgObj['provider-named-selector'] = args;\r
-            $scope.updateList($scope.list, $scope.newEpgObj, "id");\r
-        });\r
-    }]); \r
-\r
-    gbp.register.controller('wizardContractCtrl', ['$scope', '$filter', 'GBPContractServices', function($scope, $filter, GBPContractServices){ \r
-        $scope.list = [];\r
-        $scope.newContractObj = GBPContractServices.createObj();\r
-        $scope.selectedContract = null;\r
-\r
-        $scope.displayLabel = ['description', 'id'];\r
-        $scope.crudLabel = 'Contract list';\r
-\r
-        $scope.contractFormView = true;\r
-\r
-        $scope.init = function() {\r
-            \r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.contractFormView = true;\r
-            $scope.newContractObj = GBPContractServices.createObj();\r
-        };\r
-\r
-        $scope.save = function() {\r
-            $scope.updateList($scope.list, $scope.newContractObj, "id");\r
-            $scope.reload($scope.newContractObj);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newContractObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedContract) {\r
-                var index = $scope.list.indexOf($scope.selectedContract);\r
-                $scope.list.splice(index, 1);\r
-                $scope.contractFormView = false;\r
-                $scope.newContractObj = GBPContractServices.createObj();\r
-                $scope.selectedContract = null;\r
-            }\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedContract = selectedObj;\r
-            $scope.newContractObj = selectedObj;\r
-            $scope.contractFormView = true;\r
-        };\r
-\r
-        $scope.close = function() {\r
-            $scope.contractFormView = false;\r
-            //$scope.newContractObj = GBPContractServices.createObj();\r
-            //$scope.selectedContract = null;\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedContract ) {\r
-                    $scope.contractFormView = true;\r
-                    angular.copy($scope.selectedContract, $scope.newContractObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on("WIZARD_SUBJECT_RELOAD", function(event, args){\r
-            //$scope.selectedEpg['consumer-named-selector'] = args;\r
-            $scope.newContractObj['subject'] = args;\r
-            $scope.updateList($scope.list, $scope.newContractObj, "id");\r
-        });\r
-\r
-        $scope.$on("WIZARD_CLAUSE_RELOAD", function(event, args){\r
-            //$scope.selectedEpg['consumer-named-selector'] = args;\r
-            $scope.newContractObj['clause'] = args;\r
-            $scope.updateList($scope.list, $scope.newContractObj, "id");\r
-        });\r
-    }]); \r
-\r
-    gbp.register.controller('wizardCnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){\r
-        $scope.list = [];\r
-        $scope.selectedCNS = null;\r
-        $scope.newCNSObj = GBPConNamedSelServices.createObj();\r
-        $scope.internalView = {\r
-            cns: false,\r
-            edit: "view"\r
-        };\r
-        $scope.displayLabel = 'name';\r
-        $scope.crudLabel = 'Consumer named selectors list';\r
-\r
-        $scope.contractList = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contractList);\r
-\r
-        var clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedCNS = null;\r
-                $scope.newCNSObj = GBPConNamedSelServices.createObj();\r
-                $scope.internalView = {\r
-                    cns: false,\r
-                    edit: "add"\r
-                };\r
-            };\r
-\r
-        //move to separate ctrl \/\r
-        $scope.addNewElem = function(templateObj) {\r
-            if($scope.newCNSObj && $scope.newCNSObj.contract) {\r
-                var objToPush = templateObj || "";\r
-                $scope.newCNSObj.contract.push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            if($scope.newCNSObj && $scope.newCNSObj.contract) {\r
-                $scope.newCNSObj.contract.splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.updateAt = function(index, value) {\r
-            if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) {\r
-                $scope.newCNSObj.contract[index] = value;\r
-            }\r
-        };\r
-        //move to separate ctrl /\\r
-\r
-        $scope.init = function() {\r
-            clear();\r
-\r
-            if($scope.tenant && $scope.tenant['contract'].length>0) {\r
-                $scope.contractList.options = $scope.tenant['contract'];\r
-            }\r
-\r
-            if($scope.selectedEpg && $scope.selectedEpg['consumer-named-selector']) {\r
-                $scope.list = $scope.selectedEpg['consumer-named-selector'];\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newCNSObj, "name");\r
-            $scope.reload($scope.newCNSObj);\r
-            $scope.$emit('WIZARD_CNS_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newCNSObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedCNS) {\r
-                var index = $scope.list.indexOf($scope.selectedCNS);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    cns: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.$emit('WIZARD_CNS_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.selectedCNS = null;\r
-            $scope.internalView.cns = true;\r
-            $scope.internalView.edit = "add";\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newCNSObj = GBPConNamedSelServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedCNS = selectedObj;\r
-            $scope.newCNSObj = selectedObj;\r
-            $scope.internalView.cns = true;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.cns = false;\r
-            //$scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEpg ) {\r
-                    $scope.internalView.cns = true;\r
-                    $scope.internalView.edit = "add";\r
-                    angular.copy($scope.selectedCNS, $scope.newCNSObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('WIZARD_EPG_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('wizardPnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){\r
-        $scope.list = [];\r
-        $scope.selectedPNS = null;\r
-        $scope.newPNSObj = GBPProNamedSelServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.crudLabel = 'Provider named selectors list';\r
-        $scope.internalView = {\r
-            pns: false,\r
-            edit: "view"\r
-        };\r
-\r
-        $scope.contractList = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contractList);\r
-\r
-        var clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedPNS = null;\r
-                $scope.newPNSObj = GBPProNamedSelServices.createObj();\r
-                $scope.internalView = {\r
-                    pns: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        //move to separate ctrl \/\r
-        $scope.addNewElem = function(templateObj) {\r
-            if($scope.newPNSObj && $scope.newPNSObj.contract) {\r
-                var objToPush = templateObj || "";\r
-                $scope.newPNSObj.contract.push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            if($scope.newPNSObj && $scope.newPNSObj.contract) {\r
-                $scope.newPNSObj.contract.splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.updateAt = function(index, value) {\r
-            if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) {\r
-                $scope.newPNSObj.contract[index] = value;\r
-            }\r
-        };\r
-        //move to separate ctrl /\\r
-\r
-        $scope.init = function() {\r
-            clear();\r
-\r
-            if($scope.tenant && $scope.tenant['contract'].length>0) {\r
-                $scope.contractList.options = $scope.tenant['contract'];\r
-            }\r
-\r
-            if($scope.selectedEpg && $scope.selectedEpg['provider-named-selector']) {\r
-                $scope.list = $scope.selectedEpg['provider-named-selector'];\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newPNSObj, "name");\r
-            $scope.reload($scope.newPNSObj);\r
-            $scope.$emit('WIZARD_PNS_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newPNSObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedPNS) {\r
-                var index = $scope.list.indexOf($scope.selectedPNS);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    pns: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.$emit('WIZARD_PNS_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.selectedPNS = null;\r
-            $scope.internalView.pns = true;\r
-            $scope.internalView.edit = "add";\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newPNSObj = GBPProNamedSelServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedPNS = selectedObj;\r
-            $scope.newPNSObj = selectedObj;\r
-            $scope.internalView.pns = true;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.pns = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedEpg ) {\r
-                    $scope.internalView.pns = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedPNS, $scope.newPNSObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('WIZARD_EPG_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('wizardSubjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedSubject = null;\r
-        $scope.newSubjectObj = GBPSubjectServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            subject : false,\r
-            edit : "view"\r
-        };\r
-        $scope.crudLabel = 'Subject list';\r
-        $scope.errors = {};\r
-\r
-\r
-        var path = null,\r
-            mandatoryProperties = ['order'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedSubject = null;\r
-                $scope.newSubjectObj = GBPSubjectServices.createObj();\r
-                $scope.internalView = {\r
-                    subject : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            \r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newSubjectObj, "name");\r
-            $scope.reload($scope.newSubjectObj);\r
-            $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newSubjectObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedSubject) {\r
-                var index = $scope.list.indexOf($scope.selectedSubject);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    subject: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.reloadNewObj();\r
-                $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newSubjectObj = GBPSubjectServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedSubject = selectedObj;\r
-            $scope.newSubjectObj = selectedObj;\r
-            $scope.internalView.subject = true;\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.subject = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedSubject = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.subject = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedSubject ) {\r
-                    $scope.internalView.subject = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedSubject, $scope.newSubjectObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_CONTRACT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){\r
-            obj.labels = $scope.displayLabel;\r
-        });\r
-\r
-        $scope.$on("WIZARD_RULE_RELOAD", function(event, args){\r
-            //$scope.selectedEpg['consumer-named-selector'] = args;\r
-            $scope.newSubjectObj['rule'] = args;\r
-            $scope.updateList($scope.list, $scope.newSubjectObj, "id");\r
-            $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list);\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('wizardRuleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedRule = null;\r
-        $scope.newRuleObj = GBPRuleServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            rule : false,\r
-            edit : "view"\r
-        };\r
-        $scope.crudLabel = 'Rule list';\r
-        $scope.errors = {};\r
-\r
-        var path = null,\r
-            mandatoryProperties = ['order'],\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedRule = null;\r
-                $scope.newRuleObj = GBPRuleServices.createObj();\r
-                $scope.internalView = {\r
-                    rule : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            \r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newRuleObj, "name");\r
-            $scope.reload($scope.newRuleObj);\r
-            $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newRuleObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedRule) {\r
-                var index = $scope.list.indexOf($scope.selectedRule);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    rule: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.reloadNewObj();\r
-                $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newRuleObj = GBPRuleServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedRule = selectedObj;\r
-            $scope.newRuleObj = selectedObj;\r
-            $scope.internalView.rule = true;\r
-            $scope.$broadcast('WIZARD_RULE_RELOAD');\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.rule = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedRule = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.rule = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedRule ) {\r
-                $scope.internalView.rule = true;\r
-                $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedRule, $scope.newRuleObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('GBP_SUBJECT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-\r
-        $scope.$on("WIZARD_CLASREF_RELOAD", function(event, args){\r
-            $scope.newRuleObj['classifier-ref'] = args;\r
-            $scope.updateList($scope.list, $scope.newRuleObj, "name");\r
-            $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);\r
-        });\r
-\r
-        $scope.$on("WIZARD_ACTIONREF_RELOAD", function(event, args){\r
-            $scope.newRuleObj['action-ref'] = args;\r
-            $scope.updateList($scope.list, $scope.newRuleObj, "name");\r
-            $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('wizardClauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', \r
-        function($scope, GBPClauseServices, GBPSubjectServices){\r
-        $scope.list = [];\r
-        $scope.selectedClause = null;\r
-        $scope.newClauseObj = GBPClauseServices.createObj();\r
-        $scope.internalView = {\r
-            clause: false,\r
-            edit: "view"\r
-        };\r
-        $scope.displayLabel = 'name';\r
-        $scope.crudLabel = 'Clause list';\r
-\r
-        $scope.subjects = {'options' : [], 'labels' : null};\r
-        $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects);\r
-\r
-        var path = null,\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedClause = null;\r
-                $scope.newClauseObj = GBPClauseServices.createObj();\r
-                $scope.internalView = {\r
-                    clause: false,\r
-                    edit: "view"\r
-                };\r
-            };\r
-\r
-        //move to separate ctrl \/\r
-        $scope.addNewElem = function(templateObj) {\r
-            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {\r
-                $scope.init();\r
-                var objToPush = templateObj || "";\r
-                $scope.newClauseObj['subject-refs'].push(objToPush);\r
-            }\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {\r
-                $scope.newClauseObj['subject-refs'].splice(index, 1);\r
-            }\r
-        };\r
-\r
-        $scope.updateAt = function(index, value) {\r
-            if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) {\r
-                $scope.newClauseObj['subject-refs'][index] = value;\r
-            }\r
-        };\r
-        //move to separate ctrl /\\r
-\r
-        $scope.init = function() {\r
-            if($scope.selectedContract && $scope.selectedContract['subject'].length>0) {\r
-                $scope.subjects.options = $scope.selectedContract['subject'];\r
-            }\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newClauseObj, "name");\r
-            $scope.reload($scope.newClauseObj);\r
-            $scope.$emit('WIZARD_CLAUSE_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newClauseObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedClause) {\r
-                var index = $scope.list.indexOf($scope.selectedClause);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    clause: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.$emit('WIZARD_CLAUSE_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newClauseObj = GBPClauseServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedClause = selectedObj;\r
-            $scope.newClauseObj = selectedObj;\r
-            $scope.internalView.clause = true;\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.clause = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedClause = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.clause = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedClause ) {\r
-                    $scope.internalView.clause = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedClause, $scope.newClauseObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('WIZARD_SUBJECT_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('wizardActionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedActionRef = null;\r
-        $scope.newActionRefObj = GBPActionRefsServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            actionRef : false,\r
-            edit : "view"\r
-        };\r
-        $scope.crudLabel = 'Action ref list';\r
-\r
-        $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel};\r
-\r
-        var path = null,\r
-            mandatoryProperties = ['order'],\r
-\r
-            actionInstanceNamesLoad = function() {\r
-                if($scope.tenant) {\r
-                    var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.tenant.id);\r
-                    GBPActionInstanceServices.load(actionInstancePath, function(data){\r
-                        $scope.actionInstanceNames.options = data;\r
-                    },function(){\r
-                        //TODO: error cbk\r
-                    });\r
-                }\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedActionRef = null;\r
-                $scope.newActionRefObj = GBPActionRefsServices.createObj();\r
-                $scope.internalView = {\r
-                    actionRef : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            actionInstanceNamesLoad();\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newActionRefObj, "name");\r
-            $scope.reload($scope.newActionRefObj);\r
-            $scope.$emit('WIZARD_ACTIONREF_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newActionRefObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedActionRef) {\r
-                var index = $scope.list.indexOf($scope.selectedActionRef);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    actionRef: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.$emit('WIZARD_ACTIONREF_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newActionRefObj = GBPActionRefsServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedActionRef = selectedObj;\r
-            $scope.newActionRefObj = selectedObj;\r
-            $scope.internalView.actionRef = true;\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.actionRef = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedActionRef = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.actionRef = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedActionRef ) {\r
-                    $scope.internalView.actionRef = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedActionRef, $scope.newActionRefObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('WIZARD_RULE_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('wizardClassifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){\r
-        $scope.list = [];\r
-        $scope.selectedClassifierRef = null;\r
-        $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();\r
-        $scope.displayLabel = 'name';\r
-        $scope.internalView = {\r
-            classifierRef : false,\r
-            edit : "view"\r
-        };\r
-\r
-        $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel};\r
-\r
-        $scope.formDirections = ['in', 'out', 'bidirectional'];\r
-        $scope.formConnectionTracking = ['normal', 'reflexive'];\r
-\r
-        $scope.crudLabel = 'Classifier ref list';\r
-\r
-        var path = null,\r
-\r
-            instanceNamesLoad = function() {\r
-                if($scope.tenant) {\r
-                    var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.tenant.id);\r
-                    GBPClassifierInstanceServices.load(classifierInstancePath, function(data){\r
-                        $scope.instanceNames.options = data;\r
-                    },function(){\r
-                        //TODO: error cbk\r
-                    });\r
-                }\r
-            },\r
-\r
-            clear = function(){\r
-                $scope.list = [];\r
-                $scope.selectedClassifierRef = null;\r
-                $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();\r
-                $scope.internalView = {\r
-                    classifierRef : false,\r
-                    edit : "view"\r
-                };\r
-            };\r
-\r
-        $scope.init = function() {\r
-            instanceNamesLoad();\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.updateList($scope.list, $scope.newClassifierRefObj, "name");\r
-            $scope.reload($scope.newClassifierRefObj);\r
-            $scope.$emit('WIZARD_CLASREF_RELOAD', $scope.list);\r
-            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newClassifierRefObj);\r
-        };\r
-\r
-        $scope.delete = function() {\r
-            if($scope.selectedClassifierRef) {\r
-                var index = $scope.list.indexOf($scope.selectedClassifierRef);\r
-                $scope.list.splice(index, 1);\r
-                $scope.internalView = {\r
-                    classifierRef: false,\r
-                    edit: "add"\r
-                };\r
-                $scope.$emit('WIZARD_CLASREF_RELOAD', $scope.list);\r
-            }\r
-        };\r
-\r
-        $scope.reloadNewObj = function() {\r
-            $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();\r
-        };\r
-\r
-        $scope.reload = function(selectedObj) {\r
-            $scope.selectedClassifierRef = selectedObj;\r
-            $scope.newClassifierRefObj = selectedObj;\r
-            $scope.internalView.classifierRef = true;\r
-        };\r
-\r
-        $scope.showForm = function() {\r
-            $scope.reloadNewObj();\r
-            $scope.internalView.classifierRef = true;\r
-            $scope.internalView.edit = "add";\r
-            $scope.selectedClassifierRef = null;\r
-        };\r
-\r
-        $scope.close = function(){\r
-            $scope.internalView.classifierRef = false;\r
-            $scope.internalView.edit = "view";\r
-        };\r
-\r
-        $scope.$on('PGN_EDIT_ELEM', function(event){\r
-            if (!event.defaultPrevented) {\r
-                if ( $scope.selectedClassifierRef ) {\r
-                    $scope.internalView.classifierRef = true;\r
-                    $scope.internalView.edit = "edit";\r
-                    angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj);\r
-                }\r
-                event.defaultPrevented = true;\r
-            }\r
-        });\r
-\r
-        $scope.$on('WIZARD_RULE_RELOAD',function(){\r
-            $scope.init();\r
-        });\r
-    }]);\r
-\r
-    gbp.register.controller('rendererStateCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){\r
-        $scope.data = {'subject-feature-definitions' : {}};\r
-        $scope.view_path = 'src/app/gbp/views/governance';\r
-\r
-        var init = function(){\r
-            GPBServices.getDefinitions(function(classifiersDefs, actionsDefs){\r
-                $scope.data['subject-feature-definitions']['classifier-definition'] = classifiersDefs;\r
-                $scope.data['subject-feature-definitions']['action-definition'] = actionsDefs;\r
-            }, function(){\r
-                //error\r
-            });\r
-        };\r
-        \r
-        init();\r
-    }]);\r
-\r
-    gbp.register.controller('layerCtrl', ['$scope', function($scope){\r
-\r
-        var moveOffset = 1;\r
-        $scope.currentDisplayIndex = 1;\r
-        $scope.displayOffsets = [-1, 0, 1];\r
-        $scope.expanded = true;\r
-\r
-        $scope.init = function(key, value){\r
-            $scope.data = value;\r
-            if($scope.checkData(value, 'Array')){\r
-                $scope.setActData($scope.data[$scope.data.length - 1]);\r
-            }\r
-        }; \r
-\r
-        $scope.toggleExpanded = function(){\r
-            $scope.expanded = !$scope.expanded;\r
-        };\r
-\r
-        $scope.shiftDisplayNext = function() {\r
-            $scope.currentDisplayIndex = Math.min($scope.currentDisplayIndex + moveOffset, $scope.data.length - 2);\r
-        };\r
-\r
-        $scope.shiftDisplayPrev = function() {\r
-            $scope.currentDisplayIndex = Math.max($scope.currentDisplayIndex - moveOffset, 1);\r
-        };\r
-\r
-        $scope.showPrevButton = function() {\r
-            return $scope.currentDisplayIndex > 1;\r
-        };\r
-\r
-        $scope.showNextButton = function() {\r
-            return $scope.data && $scope.currentDisplayIndex < $scope.data.length - 2;\r
-        };\r
-\r
-        $scope.setActData = function(data) {\r
-            $scope.actSelected = data;\r
-        };\r
-\r
-        $scope.checkData = function(data, type){\r
-            var result = {'Array' : data instanceof Array,\r
-                        'Object' : data instanceof Object};\r
-\r
-            return result[type];\r
-        };\r
-    }]);\r
-\r
-    gbp.register.controller('actionReferenceWizardCtrl', ['$scope', '$filter', 'GBPRuleServices', 'GBPActionInstanceServices', function($scope, $filter, GBPRuleServices, GBPActionInstanceServices){ \r
-        $scope.wizardPage = null;\r
-        $scope.path = {};\r
-        $scope.rule = {};\r
-\r
-        $scope.actionInstanceNames = {'options' : [], 'labels' : "name"};\r
-\r
-        var actionInstanceNamesLoad = function() {\r
-            var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);\r
-            GBPActionInstanceServices.load(actionInstancePath, function(data){\r
-                $scope.actionInstanceNames.options = data;\r
-            },function(){\r
-                //TODO: error cbk\r
-            });\r
-        };\r
-\r
-        $scope.init = function() {\r
-            $scope.setPage('reference');\r
-        };\r
-\r
-        $scope.setPage = function(pageName, object) {\r
-            $scope.wizardPage = pageName;\r
-        };\r
-\r
-        $scope.submit = function() {\r
-            //if($scope.validateForm($scope.actionsForm)){\r
-                $scope.actionInstanceNames.options.forEach(function(i) {\r
-                    path = GBPActionInstanceServices.createPathObj($scope.path.tenantId, i.name);\r
-                //saveParams();\r
-\r
-                    GBPActionInstanceServices.send(path, i, function(data){\r
-                    $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');\r
-                    }, function(){\r
-                        //TODO: error cbk\r
-                    });\r
-                });\r
-                \r
-            //}\r
-\r
-            //if($scope.validateForm($scope.rulesForm)){\r
-                path = GBPRuleServices.createPathObj($scope.path.tenantId, $scope.path.contractId, $scope.path.subjectId, $scope.path.ruleId);\r
-                GBPRuleServices.send(path, $scope.rule, function(data){\r
-\r
-                    $scope.wizards.actionReferenceWizard = false;\r
-                    \r
-                    //$scope.sendReloadEventFromRoot('GBP_TENANT_RELOAD');\r
-                }, function(){\r
-                    //TODO: error cbk\r
-                });\r
-            //}\r
-            //$scope.\r
-        };\r
-\r
-        $scope.$on('ACTION_RULE_WIZARD_LOAD', function(event, data){\r
-            $scope.rule = angular.copy(data.data);\r
-            $scope.path = data.path;\r
-        });\r
-\r
-        $scope.$on('WIZARD_ACTIONREF_ADD', function(event, data){\r
-            if(!$scope.rule['action-ref']) {\r
-                $scope.rule['action-ref'] = [];\r
-            }\r
-            $scope.updateList($scope.rule['action-ref'], data, "name");\r
-        });\r
-\r
-        $scope.$on('WIZARD_ACTIONREF_DELETE', function(event, data){\r
-            $scope.rule['action-ref'].splice(data, 1);\r
-        });\r
-\r
-        $scope.$on('WIZARD_ACTIONINSTANCE_ADD', function(event, data){\r
-            $scope.updateList($scope.actionInstanceNames.options, data, "name");\r
-\r
-            $scope.setPage('reference');\r
-        });\r
-\r
-        $scope.$on('GBP_TENANT_RELOAD',function(){\r
-            actionInstanceNamesLoad();\r
-        });\r
-\r
-    }]);\r
-\r
-    gbp.register.controller('actionsRefListCtrl', ['$scope', '$filter', function($scope, $filter){ \r
-        \r
-        $scope.actionReferenceForm = false;\r
-\r
-        $scope.showForm = function(object) {\r
-            $scope.actionReferenceForm = true;\r
-            $scope.newActionRefObj = object || null;\r
-        };\r
-\r
-        $scope.closeForm = function() {\r
-            $scope.actionReferenceForm = false;\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.$emit('WIZARD_ACTIONREF_ADD', $scope.newActionRefObj);\r
-            $scope.resetObject();\r
-        };\r
-\r
-        $scope.deleteElemAt = function(index) {\r
-            $scope.$emit('WIZARD_ACTIONREF_DELETE', index);\r
-            $scope.resetObject();\r
-        };\r
-\r
-        $scope.resetObject = function() {\r
-            $scope.newActionRefObj = null;\r
-        };\r
-\r
-        \r
-\r
-    }]);\r
-\r
-    gbp.register.controller('actionInstanceWizardCtrl', ['$scope', '$filter', 'GPBServices', 'GBPActionInstanceServices', function($scope, $filter, GPBServices, GBPActionInstanceServices){ \r
-        $scope.actionDefinitions = {'options' : [], 'labels' : "name"};\r
-        $scope.newActionObj = GBPActionInstanceServices.createObj();\r
-\r
-        var loadDefinitions = function() {\r
-            GPBServices.getDefinitions(function(classifierDefs, actionDefs) {\r
-                $scope.actionDefinitions.options = actionDefs;\r
-                //$scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions);\r
-            });\r
-        };\r
-\r
-        $scope.reloadDefs = function(){\r
-            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id']));\r
-\r
-            //TODO: rework\r
-            if($scope.defs.length && $scope.defs[0].name === 'sfc-chain-name') {\r
-                GPBServices.getServiceFunctionChains(function(data) {\r
-                    $scope.serviceFunctionChains = data;\r
-                });\r
-            }\r
-        };\r
-\r
-        $scope.getDefinitionObjParams = function(id){\r
-            return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id);\r
-        };\r
-\r
-        $scope.save = function(){\r
-            $scope.newActionObj['parameter-value'] = [];\r
-            $scope.$broadcast('GBP_SAVE_PARAM');\r
-            $scope.$emit('WIZARD_ACTIONINSTANCE_ADD', $scope.newActionObj);\r
-            $scope.resetObject();\r
-        };\r
-\r
-        $scope.resetObject = function() {\r
-            $scope.newActionObj = GBPActionInstanceServices.createObj();\r
-        };\r
-\r
-        $scope.saveParam = function() {\r
-            \r
-        };\r
-\r
-        $scope.addParam = function(name, type, value) {\r
-            $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));\r
-        };\r
-\r
-        loadDefinitions();\r
-\r
-    }]);\r
-\r
-});\r
-\r
-\r
+var modules = ['app/gbp/gbp.module',
+               'app/gbp/gbp.services'
+               ];
+
+
+define(modules, function(gbp) {
+
+    gbp.register.controller('gbpCtrl', ['$scope', '$rootScope', 'GBPTenantServices','DesignGbpFactory', 'GBPConstants',
+        function ($scope, $rootScope, GBPTenantServices, DesignGbpFactory, GBPConstants) {
+            $rootScope['section_logo'] = 'logo_gbp';
+            $scope.view_path =  'src/app/gbp/views/';
+
+            $scope.mainView = {
+                main: true,
+                'policy-renderer': false,
+                governance: false
+            };
+
+            $scope.policyRendererView = {
+                slider : true,
+                basic : true,
+                policy: false,
+                tenants : false,
+                l2l3 : false,
+                epg : false,
+                contracts : false,
+                docs : false,
+                groupMenu: false,
+                classifiers: false,
+                actions: false,
+                registerEndpoint : false,
+                registerL3PrefixEndpoint : false
+            };
+
+            $scope.subMenuView = {
+                governance : false,
+                policy : false,
+                policySub : false,
+                renderers : false,
+                endpoints : false
+            };
+
+            $scope.breadcrumbs = {'l1' : null,
+                                  'l2' : null,
+                                  'l3' : null};
+
+            $scope.wizards = {
+                accessModelWizard: false,
+                actionReferenceWizard: false
+            };
+
+            $scope.setBreadcrumb = function(level, label, visible){
+                $scope.breadcrumbs[level] = visible ? label : null;
+                if(level === 'l1'){
+                    $scope.breadcrumbs.l2 = null;
+                    $scope.breadcrumbs.l3 = null;
+                }
+                if(level === 'l2'){
+                    $scope.breadcrumbs.l3 = null;
+                }
+            };
+
+            $scope.setViewExpand = function(menu, expand, show){
+                $scope[menu][expand] = show ? true : !$scope[menu][expand];
+                for ( var property in $scope[menu] ) {
+                    $scope[menu][property] = expand !== property ? false : $scope[menu][expand];
+                }
+
+            };
+
+            $scope.toggleExpandedMM = function(expand, show, broadcast){
+                $scope.setViewExpand('mainView',expand, show);
+
+                if ( broadcast ) {
+                    $scope.$broadcast(broadcast);
+                }
+            };
+
+            $scope.sliceLabel = function(label){
+                return label.length > GBPConstants.numbers.displayLabelLength ? label.slice(0,GBPConstants.numbers.displayLabelLength)+'...' : label;
+            };
+
+            $scope.getDisplayLabel = function(obj, labelArray, dontSlice){
+                var ret = '';
+
+                if((typeof labelArray) === 'string'){
+                    ret = obj[labelArray];
+                } else if (angular.isFunction(labelArray)) {
+                    ret = labelArray(obj);
+                } else {
+                    labelArray.some(function(labelParam) {
+                        if(angular.isFunction(labelParam)) {
+                            ret = labelParam(obj);
+                        } else if(obj.hasOwnProperty(labelParam)) {
+                            ret = obj[labelParam];
+                        }
+                        return ret;
+                    });
+                }
+
+                return dontSlice ? ret : $scope.sliceLabel(ret);
+            };
+
+            // TENANTS
+            $scope.tenantList = [];
+            $scope.selectedTenant = null;
+            $scope.tenantDisplayLabel = ['name' , 'id'];
+
+            $scope.loadTenants = function() {
+                GBPTenantServices.load(
+                    function(tenants) {
+                        $scope.tenantList = tenants;
+                        console.log('$scope.tenantList', $scope.tenantList);
+                    },
+                    function(){
+                        //TODO error
+                    });
+
+                DesignGbpFactory.setMainClass();
+            };
+
+            $scope.setTenant = function(selectedTenant) {
+                $scope.selectedTenant = selectedTenant;
+                $scope.$broadcast('GBP_TENANT_RELOAD', $scope.selectedTenant);
+            };
+
+            $scope.loadTenants();
+
+            $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){
+                $scope.loadTenants();
+            });
+
+            $scope.sendReloadEventFromRoot = function(eventName, val) {
+                $scope.$broadcast(eventName, val);
+            };
+
+
+            // TODO: rework, use $scope.setViewContent or something
+            $scope.showWizard = function(wizardName, broadcast, broadcastedData, path) {
+                $scope.wizards[wizardName] = true;
+
+                if ( broadcast ) {
+                    $scope.sendReloadEventFromRoot(broadcast, {data: broadcastedData, path: path});
+                }
+            };
+
+            $scope.closeWizard = function(wizardName) {
+                $scope.wizards[wizardName] = false;
+            };
+
+            $scope.updateList = function(list, object, key) {
+                var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);
+
+                if(elementPos < 0) {
+                    list.push(object);
+                }
+                else {
+                    list[elementPos] = object;
+                }
+            };
+
+    }]);
+
+    gbp.register.controller('governanceCtrl', ['$rootScope','$scope',
+        function ($rootScope, $scope) {
+            $scope.menuTpl = 'main-menu';
+            $scope.menuBox = null;
+            $scope.contentTpl = 'main';
+            // $scope.selectedTenant = null;
+            $scope.rendererList = [];
+            var broadcastObj = {};
+
+            $scope.rendererList.push({'name' : 'of_overlay', 'id' : 0});
+
+            $scope.toggleExpanded = function(expand, menu, tplType){
+                var type = tplType ? tplType : 'contentTpl';
+                $scope.menuBox = null;
+                
+                $scope[type] = expand;
+
+                if ( menu && menu === false ) {
+                    $scope.menuTpl = !menu ? null : menu;
+                }
+            };
+
+            
+
+            $scope.setViewContent = function(tplName, data, broadcast, tplType) {
+
+                if ( $scope[tplType] === tplName ) {
+                    $scope.$broadcast(broadcast, data, true);
+                } else {
+
+                    broadcastObj[tplType] = {};
+                    broadcastObj[tplType].name = broadcast;
+                    broadcastObj[tplType].data = data;
+
+                    $scope.toggleExpanded(tplName, null, tplType);
+                    $scope.$apply();
+
+                }
+            };
+
+            $scope.broadcastCalling = function(tplType){
+                $scope.$broadcast(broadcastObj[tplType].name, broadcastObj[tplType].data);
+            };
+
+            $scope.checkBroadcastCalling = function(tplName){
+                var objClickAction = {
+                    'epg-detail': function(){
+                        $scope.broadcastCalling('contentTpl');
+                    },
+                    'subject-detail': function(){
+                        $scope.broadcastCalling('contentTpl');
+                    }
+                };
+
+                if ( angular.isFunction(objClickAction[tplName]) ) {
+                    objClickAction[tplName]();
+                }
+                
+            };
+
+
+            $scope.$on('GOV_INIT', function(){
+                $scope.menuTpl = 'main-menu';
+                $scope.contentTpl = 'main';
+                // $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');
+                $scope.menuBox = null;
+            });
+
+            $scope.$on('GBP_TENANT_RELOAD', function(e, obj){
+                $scope.selectedTenant = obj;
+            });
+
+
+    }]);
+
+    gbp.register.controller('boxStaticCtrl',['$scope',
+        function($scope){
+
+        $scope.selectedObj = null;
+
+        $scope.getLabel = function(id, type){
+                var objAction = {
+                providerItems: function(){
+                    var name = $scope.selectedObj[type][id].attributes.objData['name'];
+                    return name ? name + ' : ' + id : id;
+                },
+                consumerItems: function(){
+                    var name = $scope.selectedObj[type][id].attributes.objData['name'];
+                    return name ? name + ' : ' + id : id;
+                }
+            };
+
+            if ( angular.isFunction(objAction[type]) ) {
+                return objAction[type]();
+            }
+        };
+
+        $scope.$on('SET_SEL_STA_OBJ', function(obj, data, apply){
+            $scope.selectedObj = data;
+
+            if ( apply ) {
+                $scope.$apply();
+            }
+
+        });
+
+    }]);
+
+    gbp.register.controller('graphCtrl', ['$scope', function($scope){
+        var paper = null,
+            paperScale = 1;
+
+        $scope.init = function(paperInstance){
+            paper = paperInstance;
+            $scope.loadMouseScrollEvent();
+        };
+
+
+        $scope.zoom = function(out){
+            paperScale = out ? paperScale - 0.1 : paperScale >= 1 ? 1 : paperScale + 0.1;
+            paper.scale(paperScale, paperScale);
+        };
+
+        
+
+        $scope.loadMouseScrollEvent = function(){
+            /*mouse wheel event for zooming*/
+            var graph = document.getElementById('graph'),
+            MouseWheelHandler = function(e){
+                var mouseEvent = window.event || e; // old IE support
+                var delta = Math.max(-1, Math.min(1, (mouseEvent.wheelDelta || -mouseEvent.detail)));
+                $scope.zoom(delta === 1 ? false : true);
+            };
+
+            if (graph.addEventListener) {
+                // IE9, Chrome, Safari, Opera
+                graph.addEventListener("mousewheel", MouseWheelHandler, false);
+                // Firefox
+                graph.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
+            }
+            // IE 6/7/8
+            else {graph.attachEvent("onmousewheel", MouseWheelHandler);}
+            /*mouse wheel event for zooming - end*/
+        };
+        
+    }]);
+
+    gbp.register.controller('expressedPolicyCtrl', ['$scope', 'JointGraphFactory', 'JointGraphOffsetFactory', 'GBPConstants',
+        function ($scope, JointGraphFactory, JointGraphOffsetFactory, GBPConstants) {
+            var paper = JointGraphFactory.createGraph(),
+                epgItems = [],
+                contractItems = [],
+                linkItems = [];
+
+            var objClickAction = {
+                epg: function(data){
+                    $scope.setViewContent('epg-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                },
+                contract: function(data){
+                    $scope.setViewContent('contract-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                }
+            };
+
+            paper.on('cell:pointerdown', function(cell) { 
+                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {
+                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);
+                }
+            });
+
+            var createEpgLinks = function(epg, epgItem, contracts) {
+                var providers = epg['provider-named-selector'] && epg['provider-named-selector'].length>0 ? epg['provider-named-selector'] : [];
+                var consumers = epg['consumer-named-selector'] && epg['consumer-named-selector'].length>0 ? epg['consumer-named-selector'] : [];
+                var consumerLinkItems = [];
+                var providerLinkItems = [];
+
+                consumers.forEach(function(c) {
+                    c.contract.forEach(function(con) {
+                        consumerLinkItems.push(JointGraphFactory.createLink(contracts[con].id, epgItem.id, 'green'));
+                    });
+                });
+
+                providers.forEach(function(p) {
+                    p.contract.forEach(function(con) {
+                        providerLinkItems.push(JointGraphFactory.createLink(epgItem.id, contracts[con].id, 'blue'));
+                    });
+                });
+
+                JointGraphFactory.addItemList(paper.model, providerLinkItems);
+                JointGraphFactory.addItemList(paper.model, consumerLinkItems);
+
+            };
+
+            var loadData = function() {
+                if($scope.selectedTenant) {
+                    var offsetObj = {
+                            ow: 100,
+                            oh: 100,
+                            w: 100,
+                            h: 100
+                        },
+                        marginObj = {
+                            w: 50,
+                            h: 80
+                        },
+                        offsetHobj = {
+                            contract: 0,
+                            epg: 0
+                        },
+                        itemsArray = {
+                            contract: [],
+                            epg: []
+                        };
+
+                    JointGraphFactory.reloadGraph(paper.model);
+
+                    if ( $scope.selectedTenant && $scope.selectedTenant.contract ) {
+
+                        $scope.selectedTenant.contract.forEach(function(c, i) {
+                            var label = c.description ? $scope.sliceLabel(c.description) : c.id,
+                                width = JointGraphFactory.getLabelLength(label.length);
+                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract');
+
+                            itemsArray.contract.push(item);
+
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                            JointGraphFactory.addItem(paper.model, item);
+                            contractItems[c.id] = item;
+                        });
+
+                        offsetHobj.contract = offsetObj.h;
+
+                    }
+
+                    if ( $scope.selectedTenant && $scope.selectedTenant['endpoint-group'] ) {
+
+                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400);
+                        $scope.selectedTenant['endpoint-group'].forEach(function(e, i) {
+                            var label = e.name || e.id,
+                                width = JointGraphFactory.getLabelLength(label.length);
+                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.epg, e, 'Click to see epg info', GBPConstants.colors.graph['pns'], 'EP group');
+
+                            itemsArray.epg.push(item);
+
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                            JointGraphFactory.addItem(paper.model, item);
+                            epgItems[e.id] = item;
+
+                            createEpgLinks(e, item, contractItems);
+                        });
+                        
+                    }
+
+                    offsetHobj.epg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.contract, 'y');
+                    JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.epg ,offsetHobj.epg, paper);
+                }
+
+            };
+
+            $scope.getPaperObj = function(){
+                return paper;
+            };
+
+            $scope.$on('GBP_TENANT_RELOAD',function(){
+                if ($scope.selectedTenant) {
+                    loadData();
+                }
+                else {
+                    JointGraphFactory.reloadGraph(paper.model);
+                }
+            });
+            
+            loadData();
+    }]);
+
+    gbp.register.controller('deliveredPolicyCtrl', ['$scope', 'GPBServices', 'JointGraphFactory', 'GBPGovernanceServices', 'JointGraphOffsetFactory', 'GBPConstants',
+        function ($scope, GPBServices, JointGraphFactory, GBPGovernanceServices, JointGraphOffsetFactory, GBPConstants) {
+            var paper = JointGraphFactory.createGraph(),
+                providerItems = {},
+                consumerItems = {},
+                subjectItems = {};
+
+            var getEpList = function() {
+                var providerEpKeys = Object.keys(providerItems),
+                    consumerEpKeys = Object.keys(consumerItems),
+                    epList = providerEpKeys.map(function (k) {
+                        return providerItems[k].attributes.objData;
+                    });
+
+                consumerEpKeys.forEach(function(k) {
+                    if(providerEpKeys.indexOf(k) === -1) {
+                        epList.push(consumerItems[k].attributes.objData);
+                    }
+                });
+
+                return epList;
+            };
+
+            var getSubjList = function() {
+                return Object.keys(subjectItems).map(function (k) {
+                    return subjectItems[k].attributes.objData;
+                });
+            };
+
+            var objClickAction = {
+                subject: function(data){
+                        data.providerItems = providerItems;
+                        data.consumerItems = consumerItems;
+                    $scope.setViewContent('subject-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                },
+                consumer: function(data) {
+                    $scope.setViewContent('epg-content-static', data, 'SET_SEL_STA_OBJ', 'menuBox');
+                },
+                provider: function(data) {
+                    $scope.setViewContent('epg-content-static', data, 'SET_SEL_STA_OBJ', 'menuBox');
+                }
+            };
+
+            var objDblClickAction = {
+                consumer: function(data){
+                       $scope.setBreadcrumb('l3', 'Endpoint group detail', true);
+                       $scope.setViewContent('epg-detail', { ep: data, epList: getEpList() }, 'SET_SELECTED_EPG','contentTpl');
+                },
+                provider: function(data){
+                       $scope.setBreadcrumb('l3', 'Endpoint group detail', true);
+                       $scope.setViewContent('epg-detail', { ep: data, epList: getEpList() }, 'SET_SELECTED_EPG','contentTpl');
+                },
+                subject: function(data) {
+                        var obj = { subject: data, 
+                                    subjList: Object.keys(subjectItems).map(function (k) {
+                                                return subjectItems[k].attributes.objData;
+                                            }),
+                                    providerItems: providerItems,
+                                    consumerItems: consumerItems
+                                };
+                        $scope.setBreadcrumb('l3', 'Subject detail', true);
+                        $scope.setViewContent('subject-detail', obj, 'SET_SELECTED_SUBJECT','contentTpl');
+                }
+            };
+
+            paper.on('cell:pointerdown', function(cell) { 
+                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {
+                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);
+                }
+            });
+
+            paper.on('cell:pointerdblclick', function(cell) { 
+                objDblClickAction[cell.model.attributes.objType](cell.model.attributes.objData);
+            });
+
+            var createSubjectLinks = function(subject, subjectItem, providerItems, consumerItems) {
+                var providerLinkItems = subject.providers.map(function(p) {
+                        return JointGraphFactory.createLink(providerItems[p].id, subjectItem.id, 'green');
+                    });
+                    consumerLinkItems = subject.consumers.map(function(c) {
+                        return JointGraphFactory.createLink(subjectItem.id, consumerItems[c].id, 'blue');
+                    });
+
+                JointGraphFactory.addItemList(paper.model, providerLinkItems);
+                JointGraphFactory.addItemList(paper.model, consumerLinkItems);
+            };
+
+            var loadData = function() {
+                if($scope.selectedTenant) {
+                    providerItems = {};
+                    consumerItems = {};
+                    subjectItems = {};
+
+                    var classifierInstances = $scope.selectedTenant['subject-feature-instances'] && 
+                                          $scope.selectedTenant['subject-feature-instances']['classifier-instance'] && 
+                                          $scope.selectedTenant['subject-feature-instances']['classifier-instance'].length > 0 ? $scope.selectedTenant['subject-feature-instances']['classifier-instance'] : [];
+
+                    var offsetObj = {
+                            ow: 100,
+                            oh: 100,
+                            w: 100,
+                            h: 100
+                        },
+                        marginObj = {
+                            w: 50,
+                            h: 80
+                        },
+                        offsetHobj = {
+                            pEpg: 0,
+                            cEpg: 0,
+                            subject: 0
+                        },
+                        itemsArray = {
+                            pEpg: [],
+                            cEpg: [],
+                            subject: []
+                        };
+
+                    JointGraphFactory.reloadGraph(paper.model);
+
+                    GBPGovernanceServices.getEPGsAndSubjects($scope.selectedTenant.id, classifierInstances, function(data){
+                        data.providers.forEach(function(p, i) {
+                            var relatedObj = GPBServices.getPropFromListByProp($scope.selectedTenant['endpoint-group'], 'id', p.id),
+                                label = relatedObj.name || p.id,
+                                width = JointGraphFactory.getLabelLength(label.length);
+
+                            relatedObj.rules = p.rules;
+                            var item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.provider, relatedObj, 'Click to see epg info, doubleclick to see Endpoint group detail', GBPConstants.colors.graph['pns'], 'Provider EPG');
+
+                            itemsArray.pEpg.push(item);
+
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                            JointGraphFactory.addItem(paper.model, item);
+                            providerItems[p.id] = item;
+                        });
+
+                        offsetHobj.pEpg = offsetObj.h;
+
+                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 500);
+                        data.consumers.forEach(function(c, i) {
+                            var relatedObj = GPBServices.getPropFromListByProp($scope.selectedTenant['endpoint-group'], 'id', c.id),
+                                label = relatedObj.name || c.id,
+                                width = JointGraphFactory.getLabelLength(label.length);
+
+                            relatedObj.rules = c.rules;
+                            var item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.consumer, relatedObj, 'Click to see epg info, doubleclick to see Endpoint group detail', GBPConstants.colors.graph['cns'], 'Consumer EPG');
+
+                            itemsArray.cEpg.push(item);
+
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                            JointGraphFactory.addItem(paper.model, item);
+                            consumerItems[c.id] = item;
+                        });
+
+                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetHobj.pEpg > 300 ? offsetHobj.pEpg : 300);
+                        data.subjects.forEach(function(s, i) {
+                            var label = s.name,
+                                width = JointGraphFactory.getLabelLength(label.length),
+                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.subject, s, 'Click to see subject info, doubleclick to see Subject detail', GBPConstants.colors.graph['subject'], 'Subject');
+
+                            itemsArray.subject.push(item);
+
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                            JointGraphFactory.addItem(paper.model, item);
+                            subjectItems[s.name] = item;
+                            createSubjectLinks(s, item, providerItems, consumerItems);
+                        });
+
+                        offsetHobj.pEpg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.pEpg, 'y');
+                        JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.subject ,offsetHobj.pEpg, paper);
+                        offsetHobj.subject = JointGraphOffsetFactory.getCurrentOffset(itemsArray.subject, 'y');
+                        JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.cEpg ,offsetHobj.subject, paper);
+
+                    }, function(){});
+
+                }
+
+
+                // paper.scaleContentToFit();
+                // paper.fitToContent();
+            };
+
+            $scope.getPaperObj = function(){
+                return paper;
+            };
+
+
+            $scope.$on('GBP_TENANT_RELOAD',function(){
+                if ($scope.selectedTenant) {
+                    loadData();
+                }
+                else {
+                    JointGraphFactory.reloadGraph(paper.model);
+                }
+            });
+
+            loadData();
+    }]);
+
+    gbp.register.controller('subjectDetailCtrl', ['$scope', 'GPBServices', 'JointGraphFactory', 'GBPGovernanceServices', 'JointGraphOffsetFactory', 'GBPConstants',
+        function ($scope, GPBServices, JointGraphFactory, GBPGovernanceServices, JointGraphOffsetFactory, GBPConstants) {
+            $scope.selectedSubject = null;
+            $scope.subjectList = [];
+
+            var paper = JointGraphFactory.createGraph(),
+                subjectItem = null,
+                ruleItems = {},
+                subjectItems = {};
+
+            var createSubjectLinks = function(subjectItem, ruleItem) {
+                var linkItem = JointGraphFactory.createLink(subjectItem.id, ruleItem.id, 'blue');
+                JointGraphFactory.addItem(paper.model, linkItem);
+            };
+
+            paper.on('cell:pointerdown', function(cell) { 
+                var objClickAction = {
+                    subject: function(data){
+                        $scope.setViewContent('subject-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                    },
+                    rule: function(data){
+                        $scope.setViewContent('rule-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                    }
+                };
+
+                // console.log('cell.model.attributes.objType', cell.model.attributes.objType, cell.model.attributes.objData);
+                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {
+                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);
+                }
+            });
+
+            var loadData = function() {
+                if($scope.selectedSubject) {
+                    subjectItem = null;
+                    ruleItems = {};
+
+                    var offsetObj = {
+                            ow: 100,
+                            oh: 100,
+                            w: 100,
+                            h: 100
+                        },
+                        marginObj = {
+                            w: 50,
+                            h: 80
+                        };
+
+                    JointGraphFactory.reloadGraph(paper.model);
+
+                    var label = $scope.selectedSubject.name || $scope.selectedSubject.id,
+                        width = JointGraphFactory.getLabelLength(label.length);
+                        subjectItem = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.subject, $scope.selectedSubject, 'Click to see subject info', GBPConstants.colors.graph['subject'], 'Subject');
+
+                    JointGraphFactory.addItem(paper.model, subjectItem);
+
+                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 300);
+                    $scope.selectedSubject.rules.forEach(function(r, i) {
+                        var label = r.name,
+                            width = JointGraphFactory.getLabelLength(label.length);
+                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.rule, r, 'Click to see rule info', GBPConstants.colors.graph['cns'], 'Rule');
+
+                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper);
+                        JointGraphFactory.addItem(paper.model, item);
+                        ruleItems[r.name] = item;
+
+                        createSubjectLinks(subjectItem, item);
+                    });
+                }
+            };
+
+            $scope.getPaperObj = function(){
+                return paper;
+            };
+
+            $scope.$on('SET_SELECTED_SUBJECT', function(event, data){
+                $scope.selectedSubject = data.subject;
+                $scope.subjectList = data.subjList;
+                loadData();
+            });
+
+            $scope.setSubject = function(subject) {
+                $scope.selectedSubject = subject;
+                loadData();
+            };
+
+            loadData();
+    }]);
+
+    gbp.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants',
+        function ($scope, JointGraphFactory, TopologyDataLoaders, GBPEpgServices, JointGraphOffsetFactory, GBPConstants) {
+            var paper = JointGraphFactory.createGraph(),
+                epgItem = {},
+                epItems = {};
+
+            $scope.epgDisplayLabel = ['name', 'id'];
+            $scope.epgList = [];
+            $scope.selectedEpg = null;
+
+            $scope.$on('SET_SELECTED_EPG', function(event, epg){
+                $scope.selectedEpg = epg.ep;
+                $scope.epgList = epg.epList;
+                loadData();
+            });
+
+            $scope.setEpg = function(epg){
+                selectedEpg = epg;
+                loadData();
+            };
+
+            paper.on('cell:pointerdown', function(cell) { 
+                var objClickAction = {
+                    ep: function(data){
+                        $scope.setViewContent('ep-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                    },
+                    epg: function(data){
+                        $scope.setViewContent('epg-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox');
+                    },
+                };
+
+                if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) {
+                    objClickAction[cell.model.attributes.objType](cell.model.attributes.objData);
+                }
+            });
+
+            var loadData = function() {
+                if($scope.selectedTenant && $scope.selectedEpg) {
+                    epgItem = {};
+                    epItems = {};
+                    links = [];
+
+                    JointGraphFactory.reloadGraph(paper.model);
+
+                    TopologyDataLoaders.getEndpointsFromEndpointGroup($scope.selectedTenant.id, $scope.selectedEpg.id, function(data){
+                       var offsetObj = {
+                            ow: 100,
+                            oh: 100,
+                            w: 100,
+                            h: 100
+                            },
+                            marginObj = {
+                                w: 50,
+                                h: 80
+                            };
+
+                        var label = $scope.selectedEpg.name || $scope.selectedEpg.id,
+                            width = JointGraphFactory.getLabelLength(label.length);
+                            epgItem = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, 'epg', $scope.selectedEpg, 'Click to see epg info', GBPConstants.colors.graph['subject'], 'EPG');
+
+                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper);
+                        JointGraphFactory.addItem(paper.model, epgItem);
+
+                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 500);
+                        if(data && data.output && data.output['ui-endpoint'] && data.output['ui-endpoint'].length){
+                            data.output['ui-endpoint'].forEach(function(ep, i){
+                                var label = ep['mac-address'] + ':' + ep['l2-context'],
+                                    width = JointGraphFactory.getLabelLength(label.length);
+                                    item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, 'ep', ep, 'Click to see ep info', GBPConstants.colors.graph['pns'], 'Endpoint');
+
+                                JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper);
+                                JointGraphFactory.addItem(paper.model, item);
+                                epItems[label] = item;
+                                links.push(JointGraphFactory.createLink(item.id, epgItem.id, 'green'));
+                            });
+
+                            JointGraphFactory.addItemList(paper.model, links);
+                        }
+                    }, function(){});
+                }
+            };
+
+            $scope.getPaperObj = function(){
+                return paper;
+            };
+
+            // init();
+    }]);
+
+    gbp.register.controller('policyRendererCtrl', ['$scope', '$http', '$timeout', 'PGNServices', 'TopoServices', 'GBPTenantServices', 'GBPConstants', 'JointGraphFactory','GBPJointGraphBuilder',
+        function ($scope, $http, $timeout, PGNServices, TopoServices, GBPTenantServices, GBPConstants, JointGraphFactory, GBPJointGraphBuilder) {
+            
+            $scope.topologyData = { nodes: [], links: [] };
+            $scope.topologyType = null;
+            $scope.topologyArgs = {};
+            $scope.legend = {};
+            $scope.showLegend = false;
+
+            var paper = JointGraphFactory.createGraph();
+
+            var reloadShowLegend = function() {
+                $scope.showLegend = !$.isEmptyObject($scope.legend);
+            };
+
+            $scope.settingsSigma = {
+                defaultLabelColor: '#fff',
+                doubleClickEnabled: false,
+                labelThreshold: 8
+            };
+
+            $scope.settingsAtlas = {
+                adjustSizes: true,
+                gravity: 0.2
+            };
+
+            $scope.viewTopo = {
+                box: false,
+                button: false
+            };
+
+            paper.on('cell:pointerdown', function(cellView, evt) {
+                if (cellView.model.isLink() && cellView.model.attributes.objData) {
+                    $scope.$broadcast('SET_LINK_DATA', cellView.model.attributes.objData);
+                }
+            });
+
+            $scope.mandatoryProperties = [];
+            $scope.loadTopology = function(type, args) {
+                if ($scope.selectedTenant) {
+                    $scope.topologyType = type;
+                    $scope.topologyArgs = args;
+                    GBPJointGraphBuilder.loadTopology(args, paper, type);
+                }
+            };
+            $scope.toggleExpanded = function(expand, show) {
+                $scope.setViewExpand('policyRendererView',expand, show, 'l2');
+
+                if($scope.policyRendererView[expand] && $scope.selectedTenant) {
+                    $scope.topologyArgs.tenantId = $scope.selectedTenant.id;
+
+                    if((expand === 'epg' || expand === 'contracts' || expand === 'classifiers' || expand === 'actions' || expand === 'renderers') && ($scope.topologyType !== GBPConstants.strings.config)) {
+                        $scope.loadTopology(GBPConstants.strings.config, $scope.topologyArgs);
+                    } else if((expand === 'l2l3' || expand === 'registerEndpoint' || expand === 'registerL3PrefixEndpoint') && ($scope.topologyType !== GBPConstants.strings.l2l3)) {
+                        $scope.loadTopology(GBPConstants.strings.l2l3, $scope.topologyArgs);
+                    }
+                }
+            };
+
+            $scope.reloadTopo = function() {
+                if($scope.selectedTenant) {
+                    $scope.topologyArgs.tenantId = $scope.selectedTenant.id;
+                    GBPJointGraphBuilder.loadTopology($scope.topologyArgs, paper, $scope.topologyType);
+                }
+            };
+
+            $scope.getDisplayLabelsFromCtrl = function(eventName, val) {
+                $scope.$broadcast(eventName, val);
+            };
+
+            $scope.validateMandatory = function(newObj, mandatoryProps){
+                var ret = true,
+                    notFilledProps = [];
+
+                mandatoryProps.forEach(function(el){
+                    if(newObj[el] === '' || newObj[el] === null || newObj[el] === undefined){
+                        notFilledProps.push(el);
+                        ret = false;
+                    }
+                });
+
+                return {'status' : ret, 'notFilledProps' : notFilledProps};
+            };
+
+            $scope.validate = function(value, errors){
+                errors.int32 = !(parseInt(value) >= -2147483648 && parseInt(value) <= 2147483647);
+            };
+
+            
+
+            $scope.validateForm = function(form) {
+                return form.$valid;
+            };
+          
+            $scope.$on('GBP_TENANT_RELOAD', function(e, obj){
+                $scope.selectedTenant = obj;
+            });
+
+    }]);
+
+    gbp.register.controller('linkDataCtrl',['$scope', function($scope){
+        $scope.showTable = false;
+
+        $scope.show = function(){
+            $scope.showTable = true;
+        };
+
+        $scope.close = function(){
+            $scope.showTable = false;
+        };
+        
+        $scope.$on('SET_LINK_DATA', function(e, obj){
+           $scope.linkData = obj;
+           $scope.show();
+           $scope.$apply();
+        });
+    }]);
+
+    gbp.register.controller('crudCtrl',['$scope',  function($scope){
+        $scope.selectedObj = null;
+        $scope.label = '';
+        $scope.q = {};
+
+        $scope.add = function() {
+            $scope.selectedObj = null;
+            $scope.showForm();
+        };
+
+        $scope.modify = function() {
+            $scope.$emit('PGN_EDIT_ELEM');
+        };
+
+        $scope.init = function(label) {
+            $scope.label = label;
+        };
+
+
+        $scope.$on('EV_SET_SEL_CLASS', function(event, selObj){
+            $scope.selectedObj = selObj;
+        });
+    }]);
+
+    gbp.register.controller('contractCtrl', ['$scope','GBPContractServices', '$filter', function($scope, GBPContractServices, $filter){
+        $scope.list = [];
+        $scope.selectedContract = null;
+        $scope.newContractObj = GBPContractServices.createObj();
+        $scope.displayLabel = ['description','id'];
+        $scope.crudLabel = 'Contract list';
+
+        $scope.internalView = {
+            contract: false,
+            edit: "view"
+        };
+
+        var path = null,
+            mandatoryProperties = [],
+            clear = function(){
+                $scope.list = [];
+                $scope.internalView = {
+                    contract: false,
+                    edit: "view"
+                };
+                $scope.selectedContract = null;
+                $scope.newContractObj = GBPContractServices.createObj();
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                $scope.selectedContract = null;
+                path = GBPContractServices.createPathObj($scope.selectedTenant.id);
+                
+                GBPContractServices.load(path, function(data){
+                    $scope.list = data;
+                    // $scope.$broadcast('GBP_CONTRACT_RELOAD');
+                    $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD');
+                }, function(){
+
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            var resp = $scope.validateMandatory($scope.newContractObj, mandatoryProperties);
+            if(resp.status){
+                path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.newContractObj.id);
+                GBPContractServices.send(path, $scope.newContractObj, function(data){
+                    $scope.init();
+                    $scope.internalView.contract = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                alert($filter('translate')('GBP_MANDATORY_NOT_FILLED')+': '+resp.notFilledProps.join(', '));
+            }
+        };
+
+        $scope.delete = function() {
+            if ( $scope.selectedContract ) {
+                path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id);
+                GBPContractServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.selectedContract = null;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newContractObj = GBPContractServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedContract = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.contract = true;
+            }else {
+                $scope.internalView.contract = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.contract) {
+                angular.copy(selectedObj, $scope.newContractObj);
+            }
+            $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.contract = true;
+            $scope.selectedContract = null;
+            $scope.internalView.edit = "add";
+        };
+
+        $scope.close = function(){
+            $scope.internalView.contract = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if(!event.defaultPrevented) {
+                if ( $scope.selectedContract ) {
+                    $scope.internalView.contract = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedContract, $scope.newContractObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(event){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_CONTRACTS_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('clauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', 
+        function($scope, GBPClauseServices, GBPSubjectServices){
+        $scope.list = [];
+        $scope.selectedClause = null;
+        $scope.newClauseObj = GBPClauseServices.createObj();
+        $scope.internalView = {
+            clause: false,
+            edit: "view"
+        };
+        $scope.displayLabel = 'name';
+        $scope.crudLabel = 'Clause list';
+
+        $scope.subjects = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects);
+
+        var path = null,
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedClause = null;
+                $scope.newClauseObj = GBPClauseServices.createObj();
+                $scope.internalView = {
+                    clause: false,
+                    edit: "view"
+                };
+            };
+
+        //move to separate ctrl \/
+        $scope.addNewElem = function(templateObj) {
+            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {
+                var objToPush = templateObj || "";
+                $scope.newClauseObj['subject-refs'].push(objToPush);
+            }
+        };
+
+        $scope.deleteElemAt = function(index) {
+            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {
+                $scope.newClauseObj['subject-refs'].splice(index, 1);
+            }
+        };
+
+        $scope.updateAt = function(index, value) {
+            if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) {
+                $scope.newClauseObj['subject-refs'][index] = value;
+            }
+        };
+        //move to separate ctrl /\
+
+        var loadSubjects = function() {
+            $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects);
+
+            GBPSubjectServices.load(path, function(data){
+                $scope.subjects.options = data;
+            }, function(){
+                //TODO: error cbk
+            });
+        };
+
+        $scope.init = function() {
+            if ( $scope.selectedContract ) {
+                path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id);
+                
+                GBPClauseServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.clauseForm)){
+                path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newClauseObj.name);
+                GBPClauseServices.send(path, $scope.newClauseObj, function(data){
+                    $scope.init();
+                    $scope.internalView.clause = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.clause = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if ( $scope.selectedClause ) {
+                path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedClause.name);
+                GBPClauseServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.selectedClause = null;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newClauseObj = GBPClauseServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedClause = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.clause = true;
+            }else {
+                $scope.internalView.clause = false;
+                $scope.internalView.edit = "view";
+            }
+            
+            if($scope.internalView.clause) {
+                angular.copy(selectedObj, $scope.newClauseObj);
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.clause = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedClause = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.clause = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedClause ) {
+                    $scope.internalView.clause = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedClause, $scope.newClauseObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_CONTRACT_RELOAD',function(){
+            $scope.internalView.clause = false;
+            $scope.init();
+        });
+
+        $scope.$on('GBP_SUBJECT_RELOAD',function(){
+            loadSubjects();
+        });
+    }]);
+
+    gbp.register.controller('subjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){
+        $scope.list = [];
+        $scope.selectedSubject = null;
+        $scope.newSubjectObj = GBPSubjectServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            subject : false,
+            edit : "view"
+        };
+        $scope.crudLabel = 'Subject list';
+        $scope.errors = {};
+
+        var path = null,
+            mandatoryProperties = ['order'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedSubject = null;
+                $scope.newSubjectObj = GBPSubjectServices.createObj();
+                $scope.internalView = {
+                    subject : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedContract ) {
+                $scope.selectedSubject = null;
+                path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id);
+                
+                GBPSubjectServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.subjectForm)){
+                path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newSubjectObj.name);
+                GBPSubjectServices.send(path, $scope.newSubjectObj, function(data){
+                    $scope.init();
+                    $scope.internalView.subject = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if ( $scope.selectedSubject ) {
+                path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name);
+                GBPSubjectServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.selectedSubject = null;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newSubjectObj = GBPSubjectServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedSubject = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.subject = true;
+            }else {
+                $scope.internalView.subject = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.subject) {
+                angular.copy(selectedObj, $scope.newSubjectObj);
+            }
+            $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.subject = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedSubject = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.subject = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedSubject ) {
+                    $scope.internalView.subject = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedSubject, $scope.newSubjectObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_CONTRACT_RELOAD',function(){
+            $scope.internalView.subject = false;
+            $scope.init();
+        });
+
+        $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('ruleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){
+        $scope.list = [];
+        $scope.selectedRule = null;
+        $scope.newRuleObj = GBPRuleServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            rule : false,
+            edit : "view"
+        };
+        $scope.crudLabel = 'Rule list';
+        $scope.errors = {};
+
+        var path = null,
+            mandatoryProperties = ['order'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedRule = null;
+                $scope.newRuleObj = GBPRuleServices.createObj();
+                $scope.internalView = {
+                    rule : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedSubject ) {
+                $scope.selectedRule = null;
+                path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name);
+                
+                GBPRuleServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.rulesForm)){
+                path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.newRuleObj.name);
+                GBPRuleServices.send(path, $scope.newRuleObj, function(data){
+                    $scope.init();
+                    $scope.internalView.rule = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if ( $scope.selectedRule ) {
+                path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name);
+                GBPRuleServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.selectedRule = null;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newRuleObj = GBPRuleServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedRule = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.rule = true;
+            }else {
+                $scope.internalView.rule = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.rule) {
+                angular.copy(selectedObj, $scope.newRuleObj);
+            }
+            $scope.$broadcast('GBP_RULE_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.rule = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedRule = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.rule = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedRule ) {
+                $scope.internalView.rule = true;
+                $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedRule, $scope.newRuleObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_SUBJECT_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('actionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){
+        $scope.list = [];
+        $scope.selectedActionRef = null;
+        $scope.newActionRefObj = GBPActionRefsServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            actionRef : false,
+            edit : "view"
+        };
+        $scope.crudLabel = 'Action ref list';
+        $scope.errors = {};
+
+        $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel};
+
+        var path = null,
+            mandatoryProperties = ['order'],
+
+            actionInstanceNamesLoad = function() {
+                var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);
+                GBPActionInstanceServices.load(actionInstancePath, function(data){
+                    $scope.actionInstanceNames.options = data;
+                },function(){
+                    //TODO: error cbk
+                });
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedActionRef = null;
+                $scope.newActionRefObj = GBPActionRefsServices.createObj();
+                $scope.internalView = {
+                    actionRef : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedRule ) {
+                $scope.selectedActionRef = null;
+                path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name);
+                
+                GBPActionRefsServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+
+                actionInstanceNamesLoad();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.actionRefForm)){
+                path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newActionRefObj.name);
+                GBPActionRefsServices.send(path, $scope.newActionRefObj, function(data){
+                    $scope.init();
+                    $scope.internalView.actionRef = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if ( $scope.selectedActionRef ) {
+                path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedActionRef.name);
+                GBPActionRefsServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.selectedActionRef = null;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newActionRefObj = GBPActionRefsServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedActionRef = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.actionRef = true;
+            }else {
+                $scope.internalView.actionRef = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.actionRef) {
+                angular.copy(selectedObj, $scope.newActionRefObj);
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.actionRef = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedActionRef = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.actionRef = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedActionRef ) {
+                    $scope.internalView.actionRef = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedActionRef, $scope.newActionRefObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_RULE_RELOAD',function(){
+            $scope.internalView.actionRef = false;
+            $scope.init();
+        });
+
+        $scope.$on('GBP_ACTION_INSTANCE_RELOAD',function(){
+            actionInstanceNamesLoad();
+        });
+    }]);
+
+    gbp.register.controller('classifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){
+        $scope.list = [];
+        $scope.selectedClassifierRef = null;
+        $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            classifierRef : false,
+            edit : "view"
+        };
+
+        $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel};
+
+        $scope.formDirections = ['in', 'out', 'bidirectional'];
+        $scope.formConnectionTracking = ['normal', 'reflexive'];
+
+        $scope.crudLabel = 'Classifier ref list';
+
+        var path = null,
+
+            instanceNamesLoad = function() {
+                var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id);
+                GBPClassifierInstanceServices.load(classifierInstancePath, function(data){
+                    $scope.instanceNames.options = data;
+                },function(){
+                    //TODO: error cbk
+                });
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedClassifierRef = null;
+                $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();
+                $scope.internalView = {
+                    classifierRef : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedRule ) {
+                $scope.selectedClassifierRef = null;
+                path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name);
+                
+
+
+                GBPClassifierRefsServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+
+                instanceNamesLoad();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.classifierRefForm)){
+                path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newClassifierRefObj.name);
+                GBPClassifierRefsServices.send(path, $scope.newClassifierRefObj, function(data){
+                    $scope.init();
+                    $scope.internalView.classifierRef = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if ( $scope.selectedClassifierRef ) {
+                path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedClassifierRef.name);
+                GBPClassifierRefsServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.selectedClassifierRef = null;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedClassifierRef = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.classifierRef = true;
+            }else {
+                $scope.internalView.classifierRef = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.classifierRef) {
+                angular.copy(selectedObj, $scope.newClassifierRefObj);
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.classifierRef = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedClassifierRef = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.classifierRef = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedClassifierRef ) {
+                    $scope.internalView.classifierRef = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_RULE_RELOAD',function(){
+            $scope.internalView.classifierRef = false;
+            $scope.init();
+        });
+
+        $scope.$on('GBP_CLASSIFIER_INSTANCE_RELOAD',function(){
+            instanceNamesLoad();
+        });
+    }]);
+
+    gbp.register.controller('tenantCtrl', ['$scope', 'GBPTenantServices', '$filter', function($scope, GBPTenantServices, $filter){ 
+        $scope.list = [];
+        $scope.selectedTenantObj = null;
+        $scope.newTenantObj = GBPTenantServices.createObj();
+        $scope.displayLabel = ['name' , 'id'];
+        $scope.crudLabel = 'Tenants list';
+
+        $scope.view = {
+            tenant: false,
+            edit: "view"
+        };
+
+        $scope.init = function() {
+            GBPTenantServices.load(
+                function(data) {
+                    $scope.list = data;
+                    $scope.newTenantObj = GBPTenantServices.createObj();
+                    $scope.selectedTenantObj = null;
+                },
+                function(){
+                    //TODO error
+                });
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.tenantForm)){
+                path = GBPTenantServices.createPathObj($scope.newTenantObj.id);
+                GBPTenantServices.send(path, $scope.newTenantObj, function(data){
+                    $scope.init();
+                    $scope.view.tenant = false;
+                    $scope.view.edit = "view";
+                    $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+         $scope.delete = function() {
+            if($scope.selectedTenantObj) {
+                path = GBPTenantServices.createPathObj($scope.selectedTenantObj.id);
+
+                GBPTenantServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.view.tenant = false;
+                    $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedTenantObj = selectedObj;
+
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.tenant = true;
+            }
+            else {
+                $scope.view.tenant = false;
+                $scope.view.edit = "view";
+            }
+
+            if ($scope.view.tenant) {
+                angular.copy(selectedObj, $scope.newTenantObj);
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.newTenantObj = GBPTenantServices.createObj();
+            $scope.selectedTenantObj = null;
+            $scope.view.tenant = true;
+            $scope.view.edit = "add";
+        };
+
+        $scope.close = function(){
+            $scope.view.tenant = false;
+            $scope.view.edit = "view";
+        };
+
+       $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedTenantObj ) {
+                    $scope.view.tenant = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedTenantObj, $scope.newTenantObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('epgCtrl',['$scope', 'GBPEpgServices', 'GBPContractServices', '$filter',
+        function($scope, GBPEpgServices, GBPContractServices, $filter){
+        $scope.selectedEpg = null;
+        $scope.newEpgObj = GBPEpgServices.createObj();
+        $scope.displayLabel = ['name', 'id'];
+        $scope.crudLabel = 'Group list';
+
+        $scope.igpOpts = ['allow', 'require-contract'];
+
+        $scope.contracts = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contracts);
+
+        $scope.list = [];
+
+        $scope.internalView = {
+            epg: false,
+            edit: "view"
+        };
+
+        var loadContracts = function() {
+                GBPContractServices.load(path, function(data){
+                    $scope.contracts.options = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            },
+
+            mandatoryProperties = ['name'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedEpg = null;
+                $scope.newEpgObj = GBPEpgServices.createObj();
+                 $scope.internalView = {
+                    epg: false,
+                    edit: "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ($scope.selectedTenant) {
+                path = GBPEpgServices.createPathObj($scope.selectedTenant.id);
+                
+                GBPEpgServices.load(path, function(data){
+                    $scope.list = data;
+                    // $scope.$broadcast('GBP_EPG_RELOAD');
+                    $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+
+                loadContracts();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.epgForm)){
+                path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.newEpgObj.id);
+                GBPEpgServices.send(path, $scope.newEpgObj, function(data){
+                    $scope.init();
+                    $scope.internalView.epg = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.edit = "view";
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedEpg) {
+                path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id);
+                GBPEpgServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.internalView.epg = false;
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.internalView.epg = true;
+            $scope.reloadNewObj();
+            $scope.selectedEpg = null;
+            $scope.internalView.edit = "add";
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newEpgObj = GBPEpgServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedEpg = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.epg = true;
+            }else {
+                $scope.internalView.epg = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.epg) {
+                angular.copy(selectedObj, $scope.newEpgObj);
+            }
+            $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD');
+        };
+
+        $scope.close = function(){
+            $scope.internalView.epg = false;
+            $scope.internalView.edit = "view";
+        };
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEpg ) {
+                    $scope.internalView.epg = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedEpg, $scope.newEpgObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_CONTRACT_RELOAD',function(){
+            loadContracts();
+        });
+
+        $scope.$on('GBP_EPG_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('cnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){
+        $scope.list = [];
+        $scope.selectedCNS = null;
+        $scope.newCNSObj = GBPConNamedSelServices.createObj();
+        $scope.internalView = {
+            cns: false,
+            edit: "view"
+        };
+        $scope.displayLabel = 'name';
+        $scope.crudLabel = 'Consumer named selectors list';
+
+        var clear = function(){
+                $scope.list = [];
+                $scope.selectedCNS = null;
+                $scope.newCNSObj = GBPConNamedSelServices.createObj();
+                $scope.internalView = {
+                    cns: false,
+                    edit: "view"
+                };
+            };
+
+        //move to separate ctrl \/
+        $scope.addNewElem = function(templateObj) {
+            if($scope.newCNSObj && $scope.newCNSObj.contract) {
+                var objToPush = templateObj || "";
+                $scope.newCNSObj.contract.push(objToPush);
+            }
+        };
+
+        $scope.deleteElemAt = function(index) {
+            if($scope.newCNSObj && $scope.newCNSObj.contract) {
+                $scope.newCNSObj.contract.splice(index, 1);
+            }
+        };
+
+        $scope.updateAt = function(index, value) {
+            if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) {
+                $scope.newCNSObj.contract[index] = value;
+            }
+        };
+        //move to separate ctrl /\
+
+        $scope.init = function() {
+            if ($scope.selectedTenant && $scope.selectedEpg) {
+                path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id);
+
+                GBPConNamedSelServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.cnsForm)){
+                path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newCNSObj.name);
+                GBPConNamedSelServices.send(path, $scope.newCNSObj, function(data){
+                    $scope.init();
+                    $scope.internalView.cns = false;
+                    $scope.internalView.cns = "view";
+                    $scope.reloadNewObj();
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedCNS) {
+                path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedCNS.name);
+                GBPConNamedSelServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.selectedCNS = null;
+            $scope.internalView.cns = true;
+            $scope.internalView.edit = "add";
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newCNSObj = GBPConNamedSelServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedCNS = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.cns = true;
+            }else {
+                $scope.internalView.cns = false;
+                $scope.internalView.edit = "view";
+            }
+
+            if($scope.internalView.cns) {
+                angular.copy(selectedObj, $scope.newCNSObj);
+            }
+        };
+
+        $scope.close = function(){
+            $scope.internalView.cns = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEpg ) {
+                    $scope.internalView.cns = true;
+                    $scope.internalView.edit = "add";
+                    angular.copy($scope.selectedCNS, $scope.newCNSObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_EPG_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('pnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){
+        $scope.list = [];
+        $scope.selectedPNS = null;
+        $scope.newPNSObj = GBPProNamedSelServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.crudLabel = 'Provider named selectors list';
+        $scope.internalView = {
+            pns: false,
+            edit: "view"
+        };
+
+        var clear = function(){
+                $scope.list = [];
+                $scope.selectedPNS = null;
+                $scope.newPNSObj = GBPProNamedSelServices.createObj();
+                $scope.internalView = {
+                    pns: false,
+                    edit: "view"
+                };
+            };
+
+        //move to separate ctrl \/
+        $scope.addNewElem = function(templateObj) {
+            if($scope.newPNSObj && $scope.newPNSObj.contract) {
+                var objToPush = templateObj || "";
+                $scope.newPNSObj.contract.push(objToPush);
+            }
+        };
+
+        $scope.deleteElemAt = function(index) {
+            if($scope.newPNSObj && $scope.newPNSObj.contract) {
+                $scope.newPNSObj.contract.splice(index, 1);
+            }
+        };
+
+        $scope.updateAt = function(index, value) {
+            if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) {
+                $scope.newPNSObj.contract[index] = value;
+            }
+        };
+        //move to separate ctrl /\
+
+        $scope.init = function() {
+            if ($scope.selectedTenant && $scope.selectedEpg) {
+                path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id);
+                
+                GBPProNamedSelServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.pnsForm)){
+                path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newPNSObj.name);
+                GBPProNamedSelServices.send(path, $scope.newPNSObj, function(data){
+                    $scope.init();
+                    $scope.internalView.pns = false;
+                    $scope.reloadNewObj();
+                    $scope.internalView.cns = "view";
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedPNS) {
+                path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedPNS.name);
+                GBPProNamedSelServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.pns = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedPNS = null;
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newPNSObj = GBPProNamedSelServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedPNS = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.pns = true;
+            }else {
+                $scope.internalView.pns = false;
+                $scope.internalView.edit = "view";
+            }
+            
+            if($scope.internalView.pns) {
+                angular.copy(selectedObj, $scope.newPNSObj);
+            }
+        };
+
+        $scope.close = function(){
+            $scope.internalView.pns = false;
+            $scope.internalView.edit = "view";
+        };
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEpg ) {
+                    $scope.internalView.pns = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedPNS, $scope.newPNSObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_EPG_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('l2FloodCtrl', ['$scope', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter', function($scope, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){ 
+        $scope.list = [];
+        $scope.selectedL2Flood = null;
+        $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();
+        $scope.displayLabel = ['name', 'id'];
+        $scope.crudLabel = 'L2 Flood Domain list';
+
+        $scope.l2bridge = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L2BRIDGE_LABEL', $scope.l2bridge);
+
+        $scope.view = {
+            l2flood: false,
+            edit: "view"
+        };
+
+        var path = null,
+
+            loadL2BridgeList = function() {
+                GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(data){
+                    $scope.l2bridge.options = data;
+                }, function(){
+
+                });
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedL2Flood = null;
+                $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();
+                $scope.view = {
+                    l2flood: false,
+                    edit: "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id);
+                
+                GBPL2FloodDomainServices.load(path, function(data){
+                    $scope.list = data;
+                    // clear objects
+                    $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();
+                    $scope.selectedL2Flood = null;
+                }, function(){
+
+                });
+
+                loadL2BridgeList();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.l2FloodForm)){
+                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2FloodObj.id);
+                GBPL2FloodDomainServices.send(path, $scope.newL2FloodObj, function(data){
+                    $scope.init();
+                    $scope.view.l2flood = false;
+                    $scope.view.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD');
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedL2Flood) {
+                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Flood.id);
+                GBPL2FloodDomainServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.view.l2flood = false;
+                    $scope.view.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD');
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedL2Flood = selectedObj;
+
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.l2flood = true;
+            }
+            else {
+                $scope.view.l2flood = false;
+                $scope.view.edit = "view";
+            }
+
+            if ($scope.view.l2flood) {
+                angular.copy(selectedObj, $scope.newL2FloodObj);
+            }
+
+            $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj();
+            $scope.selectedL2Flood = null;
+            $scope.view.l2flood = true;
+            $scope.view.edit = "add";
+        };
+
+        $scope.close = function(){
+            $scope.view.l2flood = false;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedL2Flood ) {
+                    $scope.view.l2flood = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedL2Flood, $scope.newL2FloodObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){
+            loadL2BridgeList();
+        });
+
+        $scope.$on('GBP_L2FLOOD_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('l2BridgeCtrl', ['$scope', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ 
+        $scope.list = [];
+        $scope.selectedL2Bridge = null;
+        $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();
+        $scope.displayLabel = ['name', 'id'];
+        $scope.crudLabel = 'L2 Bridge Domain list';
+
+        $scope.l3context = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context);
+
+        $scope.view = {
+            l2bridge: false,
+            edit: "view"
+        };
+
+        var path = null,
+
+            loadL3ContextList = function() {
+                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){
+                    $scope.l3context.options = data;
+                    //$scope.$broadcast('GBP_L2BRIDGE_RELOAD');
+                }, function(){
+
+                });
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedL2Bridge = null;
+                $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();
+                $scope.view = {
+                    l2bridge: false,
+                    edit: "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id);
+                
+                GBPL2BridgeDomainServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();
+                    $scope.selectedL2Bridge = null;
+                    // $scope.$broadcast('GBP_L2BRIDGE_RELOAD');
+                }, function(){
+
+                });
+
+                loadL3ContextList();
+            }else{
+                clear();
+            }
+        };
+
+
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.l2BridgeForm)){
+                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2BridgeObj.id);
+                GBPL2BridgeDomainServices.send(path, $scope.newL2BridgeObj, function(data){
+                    $scope.init();
+                    $scope.view.l2bridge = false;
+                    $scope.view.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedL2Bridge) {
+                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Bridge.id);
+                GBPL2BridgeDomainServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.view.l2bridge = false;
+                    $scope.view.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedL2Bridge = selectedObj;
+
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.l2bridge = true;
+            }
+            else {
+                $scope.view.l2bridge = false;
+                $scope.view.edit = "view";
+            }
+
+            if ($scope.view.l2bridge) {
+                angular.copy(selectedObj, $scope.newL2BridgeObj);
+            }
+
+            $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj();
+            $scope.selectedL2Bridge = null;
+            $scope.view.l2bridge = true;
+            $scope.view.edit = "add";
+        };
+
+        $scope.close = function(){
+            $scope.view.l2bridge = false;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedL2Bridge ) {
+                    $scope.view.l2bridge = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedL2Bridge, $scope.newL2BridgeObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){
+            loadL3ContextList();
+        });
+
+        $scope.$on('GBP_L2BRIDGE_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('l3ContextCtrl', ['$scope', 'GBPL3ContextServices', '$filter', function($scope, GBPL3ContextServices, $filter){ //GBPContractServices
+        $scope.list = [];
+        $scope.selectedL3Context = null;
+        $scope.newL3ContextObj = GBPL3ContextServices.createObj();
+        $scope.displayLabel = ['name', 'id'];
+        $scope.crudLabel = 'L3 Context list';
+
+        $scope.view = {
+            l3context: false,
+            edit: "view"
+        };
+
+        var path = null,
+
+            clear = function(){
+                $scope.list = [];
+                $scope.view = {
+                    l3context: false,
+                    edit: "view"
+                };
+                $scope.selectedL3Context = null;
+                $scope.newL3ContextObj = GBPL3ContextServices.createObj();
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id);
+                
+                GBPL3ContextServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.newL3ContextObj = GBPL3ContextServices.createObj();
+                    $scope.selectedL3Context = null;
+                }, function(){
+
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+             if($scope.validateForm($scope.l3ContextForm)){
+                path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.newL3ContextObj.id);
+                GBPL3ContextServices.send(path, $scope.newL3ContextObj, function(data){
+                    $scope.init();
+                    $scope.view.l3context = false;
+                    $scope.view.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD');
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedL3Context) {
+                path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.selectedL3Context.id);
+                GBPL3ContextServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.view.l3context = false;
+                    $scope.view.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD');
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedL3Context = selectedObj;
+            
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.l3context = true;
+            }
+            else {
+                $scope.view.l3context = false;
+                $scope.view.edit = "view";
+            }
+
+            if($scope.view.l3context) {
+                angular.copy(selectedObj, $scope.newL3ContextObj);
+            }
+
+            $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.newL3ContextObj = GBPL3ContextServices.createObj();
+            $scope.selectedL3Context = null;
+            $scope.view.l3context = true;
+            $scope.view.edit = "add";
+        };
+
+        $scope.close = function(){
+            $scope.view.l3context = false;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedL3Context ) {
+                    $scope.view.l3context = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedL3Context, $scope.newL3ContextObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_L3CONTEXT_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('subnetCtrl', ['$scope', 'GBPSubnetServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPSubnetServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ 
+        $scope.list = [];
+        $scope.selectedSubnet = null;
+        $scope.newSubnetObj = GBPSubnetServices.createObj();
+        $scope.displayLabel = ['name', 'id'];
+        $scope.crudLabel = 'Subnet list';
+
+        $scope.l2L3List = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2L3List);
+
+        $scope.view = {
+            subnet: false,
+            edit: "view"
+        };
+
+
+        var path = null,
+
+            loadL2L3List = function() {
+                $scope.l2L3List.options = [];
+
+                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(l3ContextData){
+                    $scope.l2L3List.options = $scope.l2L3List.options.concat(l3ContextData);
+                }, function(){
+
+                });
+
+                GBPL2FloodDomainServices.load(GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id), function(l2FloodData){
+                    $scope.l2L3List.options = $scope.l2L3List.options.concat(l2FloodData);
+                }, function(){
+
+                });
+
+                GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(l2BridgeData){
+                    $scope.l2L3List.options = $scope.l2L3List.options.concat(l2BridgeData);
+                }, function(){
+
+                });
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.view = {
+                    subnet: false,
+                    edit: "view"
+                };
+                $scope.selectedSubnet = null;
+                $scope.newSubnetObj = GBPSubnetServices.createObj();
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                path = GBPSubnetServices.createPathObj($scope.selectedTenant.id);
+                
+                GBPSubnetServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.newSubnetObj = GBPSubnetServices.createObj();
+                    $scope.selectedSubnet = null;
+
+                    $scope.view.subnet = false;
+                    $scope.view.edit = "view";
+                    //$scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD');
+                }, function(){
+
+                });
+
+                loadL2L3List();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+           if($scope.validateForm($scope.subnetForm)){
+                path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.newSubnetObj.id);
+                GBPSubnetServices.send(path, $scope.newSubnetObj, function(data){
+                    $scope.init();
+                    $scope.view.subnet = false;
+                    $scope.view.edit = "view";
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedSubnet) {
+                path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id);
+                GBPSubnetServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.view.subnet = false;
+                    $scope.view.edit = "view";
+
+                    $scope.reloadTopo();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedSubnet = selectedObj;
+            
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.subnet = true;
+            }
+            else {
+                $scope.view.subnet = false;
+                $scope.view.edit = "view";
+            }
+
+            if($scope.view.subnet) {
+                angular.copy(selectedObj, $scope.newSubnetObj);
+            }
+
+            $scope.sendReloadEventFromRoot('GBP_SUBNET_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.newSubnetObj = GBPSubnetServices.createObj();
+            $scope.selectedSubnet = null;
+            $scope.view.subnet = true;
+            $scope.view.edit = "add";
+        };
+
+        $scope.close = function(){
+            $scope.view.subnet = false;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedSubnet ) {
+                    $scope.view.subnet = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedSubnet, $scope.newSubnetObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_GATEWAY_RELOAD',function(){
+            $scope.init();
+        });
+        
+        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){
+            loadL2L3List();
+        });
+
+        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){
+            loadL2L3List();
+        });
+
+        $scope.$on('GBP_L2FLOOD_RELOAD',function(){
+            loadL2L3List();
+        });
+
+        $scope.$on('GBP_PREFIX_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('gatewayCtrl', ['$scope', 'GBPGatewayServices', function($scope, GBPGatewayServices){ 
+        $scope.list = [];
+        $scope.gatewayView = false;
+        $scope.selectedGateway = null;
+        $scope.newGatewayObj = GBPGatewayServices.createObj();
+        $scope.displayLabel = 'gateway';
+        $scope.crudLabel = 'Gateway list';
+        $scope.internalView = {
+            gateway: false,
+            edit: "view"
+        };
+
+        var path = null,
+
+            clear = function(){
+                $scope.list = [];
+                $scope.gatewayView = false;
+                $scope.selectedGateway = null;
+                $scope.newGatewayObj = GBPGatewayServices.createObj();
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant && $scope.selectedSubnet ) {
+                path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id);
+                
+                GBPGatewayServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.newGatewayObj = GBPGatewayServices.createObj();
+                    $scope.internalView.gateway = false;
+                    $scope.selectedGateway = null;
+                }, function(){
+
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.gatewayForm)){
+                path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.newGatewayObj.gateway);
+                GBPGatewayServices.send(path, $scope.newGatewayObj, function(data){
+                    $scope.init();
+                    $scope.internalView.gateway = false;
+                    $scope.internalView.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) {
+                path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway);
+                GBPGatewayServices.delete(path, function(data){
+                    $scope.init();
+                    $scope.internalView.gateway = false;
+                    $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedGateway = selectedObj;
+            angular.copy(selectedObj, $scope.newGatewayObj);
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.gateway = true;
+            }else {
+                $scope.internalView.gateway = false;
+                $scope.internalView.edit = "view";
+            }
+
+            $scope.sendReloadEventFromRoot('GBP_GATEWAY_SET');
+        };
+
+        $scope.showForm = function() {
+            $scope.newGatewayObj = GBPGatewayServices.createObj();
+            $scope.internalView.gateway = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedGateway = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.gateway = false;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedGateway ) {
+                    $scope.internalView.gateway = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedGateway, $scope.newGatewayObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_SUBNET_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_PREFIX_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('prefixCtrl', ['$scope', 'GBPPrefixServices', function($scope, GBPPrefixServices){ 
+        $scope.list = [];
+        $scope.selectedPrefix = null;
+        $scope.newPrefixObj = GBPPrefixServices.createObj();
+        $scope.displayLabel = 'prefix';
+        $scope.crudLabel = 'Prefix list';
+        $scope.internalView = {
+            prefix: false,
+            edit: "view"
+        };
+
+        var path = null,
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedPrefix = null;
+                $scope.newPrefixObj = GBPPrefixServices.createObj();
+                $scope.internalView = {
+                    prefix: false,
+                    edit: "view"
+                };
+            };
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) {
+                path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway);
+                
+                GBPPrefixServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.newPrefixObj = GBPPrefixServices.createObj();
+                    $scope.internalView.prefix = false;
+                    $scope.selectedPrefix = null;
+                }, function(){
+
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.prefixForm)){
+                path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.newPrefixObj.prefix);
+                GBPPrefixServices.send(path, $scope.newPrefixObj, function(data){
+                    $scope.init();
+                    $scope.internalView.prefix = false;
+                    $scope.internalView.edit = "view";
+                    $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.selectedPrefix.prefix);
+            GBPPrefixServices.delete(path, function(data){
+                $scope.init();
+                $scope.internalView.prefix = false;
+                $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD');
+            }, function(){
+                //TODO: error cbk
+            });
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedPrefix = selectedObj;
+            $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view";
+            if(selectedObj){
+                $scope.internalView.prefix = true;
+            }else {
+                $scope.internalView.prefix = false;
+                $scope.internalView.edit = "view";
+            }
+
+            angular.copy(selectedObj, $scope.newPrefixObj);
+        };
+
+        $scope.showForm = function() {
+            $scope.newPrefixObj = GBPPrefixServices.createObj();
+            $scope.internalView.prefix = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedPrefix = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.prefix = false;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedPrefix ) {
+                    $scope.internalView.prefix = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedPrefix, $scope.newPrefixObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_GATEWAY_SET',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('renderersCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ //GBPContractServices
+        $scope.classifierDefinitions = {'options' : [], 'labels' : null};
+        $scope.actionDefinitions = {'options' : [], 'labels' : null};
+
+        //reload on event?
+
+        var loadDefinitions = function() {
+            GPBServices.getDefinitions(function(classifierDefs, actionDefs) {
+                $scope.classifierDefinitions.options = classifierDefs;
+                $scope.getDisplayLabelsFromCtrl('GBP_CLASSIFIERS_LABEL', $scope.classifierDefinitions);
+
+                $scope.actionDefinitions.options = actionDefs;
+                $scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions);
+            });
+        };
+
+        loadDefinitions();
+    }]);
+
+    gbp.register.controller('paramCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){
+        $scope.value = null;
+
+        $scope.init = function(param, paramValues) {
+            $scope.parameter = param;
+
+            if(paramValues) {
+                paramValues.forEach(function(p) {
+                    if($scope.parameter.name === p.name) {
+                        $scope.value = GPBServices.getInstanceParamValue(p);
+                    }
+                });
+            }
+        };
+
+        $scope.$on('GBP_SAVE_PARAM', function(event){
+            if($scope.value !== '' && $scope.value !== null) {
+                $scope.addParam($scope.parameter.name, $scope.parameter.type, $scope.value);
+            }
+        });
+
+        $scope.$on('GBP_SET_PARAM_VALUE', function(event, name, intVal, strVal) {
+            //console.info($scope.parameter, ' got GBP_SET_PARAM_VALUE', name, intVal, strVal, event);
+            
+        });
+
+        $scope.$on('GBP_RESET_PARAM', function(event){
+            $scope.value = null;
+        });
+    }]);
+
+    gbp.register.controller('classifiersCtrl', ['$scope', 'GBPClassifierInstanceServices', 'GPBServices', '$filter',
+        function($scope, GBPClassifierInstanceServices, GPBServices, $filter){
+        $scope.list = [];
+        $scope.classifiersView = false;
+        $scope.displayLabel = 'name';
+        $scope.selectedClassifier = null;
+        $scope.crudLabel = 'Classifiers';
+        $scope.newClassifierObj = GBPClassifierInstanceServices.createObj();
+        $scope.edit = "view";
+
+        var mandatoryProperties = ['name'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.classifiersView = false;
+                $scope.selectedClassifier = null;
+                $scope.newClassifierObj = GBPClassifierInstanceServices.createObj();
+                $scope.edit = "view";
+            };
+
+        $scope.getDefinitionObjParams = function(id){
+            return GPBServices.getDefinitionObjParams($scope.classifierDefinitions.options, id);
+        };
+
+        $scope.reloadDefs = function(){
+            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newClassifierObj['classifier-definition-id']));
+        };
+
+        $scope.addParam = function(name, type, value) {
+            $scope.newClassifierObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));
+        };
+
+        var saveParams = function() {
+            $scope.newClassifierObj['parameter-value'] = [];
+            $scope.$broadcast('GBP_SAVE_PARAM');
+        };
+
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id);
+                GBPClassifierInstanceServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.reloadDefs();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.classifierForm)){
+                path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newClassifierObj.name);
+                saveParams();
+                GBPClassifierInstanceServices.send(path, $scope.newClassifierObj, function(data){
+                    $scope.init();
+                    $scope.classifiersView = false;
+                    $scope.edit = "view";
+                $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.newClassifierObj = GBPClassifierInstanceServices.createObj();
+            $scope.selectedClassifier = null;
+            $scope.classifiersView = true;
+            $scope.edit = "add";
+            $scope.reloadDefs();
+        };
+
+        $scope.reload = function(selectedObj){
+            $scope.selectedClassifier = selectedObj;
+            $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD');
+
+            $scope.edit = $scope.edit == "edit" ? $scope.edit : "view";
+            if(selectedObj){
+                $scope.classifiersView = true;
+            }
+            else {
+                $scope.classifiersView = false;
+                $scope.edit = "view";
+            }
+
+            if($scope.classifiersView) {
+                angular.copy(selectedObj, $scope.newClassifierObj);
+            }
+
+            $scope.reloadDefs();
+        };
+
+        $scope.close = function(){
+            $scope.classifiersView = false;
+            $scope.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedClassifier ) {
+                    $scope.classifiersView = true;
+                    angular.copy($scope.selectedClassifier, $scope.newClassifierObj);
+                    $scope.edit = "edit";
+                    $scope.reloadDefs();
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.delete = function(){
+            path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedClassifier.name);
+            GBPClassifierInstanceServices.delete(path, function(data){
+                $scope.init();
+                $scope.classifiersView = false;
+                $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD');
+            }, function(){
+                //TODO: error cbk
+            });
+        };
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_CLASSIFIERS_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('actionsCtrl', ['$scope', 'GBPActionInstanceServices', 'GPBServices', '$filter',
+        function($scope, GBPActionInstanceServices, GPBServices, $filter){
+        $scope.list = [];
+        $scope.actionsView = false;
+        $scope.displayLabel = 'name';
+        $scope.selectedAction = null;
+        $scope.crudLabel = 'Actions';
+        $scope.newActionObj = GBPActionInstanceServices.createObj();
+        $scope.edit = "view";
+
+        var mandatoryProperties = ['name'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.actionsView = false;
+                $scope.selectedAction = null;
+                $scope.newActionObj = GBPActionInstanceServices.createObj();
+                $scope.edit = "view";
+            };
+
+        $scope.getDefinitionObjParams = function(id){
+            return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id);
+        };
+
+        $scope.reloadDefs = function(){
+            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id']));
+        };
+
+        $scope.addParam = function(name, type, value) {
+            $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));
+        };
+
+        var saveParams = function() {
+            $scope.newActionObj['parameter-value'] = [];
+            $scope.$broadcast('GBP_SAVE_PARAM');
+        };
+
+
+        $scope.init = function() {
+            if ( $scope.selectedTenant ) {
+                path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);
+                GBPActionInstanceServices.load(path, function(data){
+                    $scope.list = data;
+                    $scope.reloadDefs();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }else{
+                clear();
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.actionsForm)){
+                path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newActionObj.name);
+                saveParams();
+
+                GBPActionInstanceServices.send(path, $scope.newActionObj, function(data){
+                    $scope.init();
+                    $scope.actionsView = false;
+                    $scope.edit = "view";
+                $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.newActionObj = GBPActionInstanceServices.createObj();
+            $scope.selectedAction = null;
+            $scope.actionsView = true;
+            $scope.edit = "add";
+            $scope.reloadDefs();
+        };
+
+        $scope.reload = function(selectedObj){
+            $scope.selectedAction = selectedObj;
+            $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');
+
+            $scope.edit = $scope.edit == "edit" ? $scope.edit : "view";
+            if(selectedObj){
+                $scope.actionsView = true;
+            }
+            else {
+                $scope.actionsView = false;
+                $scope.edit = "view";
+            }
+
+            if($scope.actionsView) {
+                angular.copy(selectedObj, $scope.newActionObj);
+            }
+
+            $scope.reloadDefs();
+        };
+
+        $scope.close = function(){
+            $scope.actionsView = false;
+            $scope.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedAction ) {
+                    $scope.actionsView = true;
+                    angular.copy($scope.selectedAction, $scope.newActionObj);
+                    $scope.edit = "edit";
+                    $scope.reloadDefs();
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.delete = function(){
+            path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedAction.name);
+            GBPActionInstanceServices.delete(path, function(data){
+                $scope.init();
+                $scope.actionsView = false;
+                $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');
+            }, function(){
+                //TODO: error cbk
+            });
+        };
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_ACTIONS_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+    }]);
+
+    gbp.register.controller('endpointCtrl', ['$scope', 'GBPEndpointServices', 'GPBServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', 'GBPEpgServices', '$filter', 'GBPSubnetServices',
+        function($scope, GBPEndpointServices, GPBServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, GBPEpgServices, $filter, GBPSubnetServices){
+        $scope.list = [];
+        $scope.selectedEndpoint = null;
+        $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);
+        $scope.displayLabel = function(obj) {
+            return obj['mac-address'] + ':' + obj['l2-context'];
+        };
+        $scope.crudLabel = 'Endpoint list';
+
+        $scope.l2context = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context);
+
+        $scope.l3context = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context);
+
+        $scope.subnet = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_SUBNET_LABEL', $scope.subnet);
+
+        $scope.epg = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg);
+
+        $scope.networkContainment = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.networkContainment);
+
+        $scope.view = {
+            endpoint: false,
+            edit: "view"
+        };
+
+        var path = null,
+            mandatoryProperties = [],
+
+            loadEpgOptions = function() {
+                $scope.epg.options = [];
+
+                path = GBPEpgServices.createPathObj($scope.selectedTenant.id);
+                GBPEpgServices.load(path, function(data){
+                    $scope.epg.options = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            },
+
+            loadL2ContextOptions = function() {
+                removeL2ContextOptions($scope.networkContainment.options, $scope.l2context.options);
+                $scope.l2context.options = [];
+
+                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id);
+                    
+                GBPL2FloodDomainServices.load(path, function(data){
+                    $scope.l2context.options = $scope.l2context.options.concat(data);
+                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);
+                }, function(){
+
+                });
+
+                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id);
+                GBPL2BridgeDomainServices.load(path, function(data){
+                    $scope.l2context.options = $scope.l2context.options.concat(data);
+                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);
+                }, function(){
+
+                });
+            },
+
+            loadL3ContextOptions = function(){
+                removeL2ContextOptions($scope.networkContainment.options, $scope.l3context.options);
+                $scope.l3context.options = [];
+
+                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){
+                    $scope.l3context.options = data;
+                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);
+                }, function(){
+
+                });
+            },
+
+            loadSubnetOptions = function(){
+                $scope.subnet.options = [];
+
+                GBPSubnetServices.load(GBPSubnetServices.createPathObj($scope.selectedTenant.id), function(data){
+                    $scope.subnet.options = data;
+                    $scope.networkContainment.options = $scope.networkContainment.options.concat(data);
+                }, function(){
+
+                });
+            },
+
+            loadNetworkCotnaninemnt = function(){
+                $scope.networkContainment.options = [];
+
+                loadL2ContextOptions();
+                loadL3ContextOptions();
+                loadSubnetOptions();
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedEndpoint = null;
+                $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);
+                $scope.view = {
+                    endpoint: false,
+                    edit: "view"
+                };
+            },
+            removeL2ContextOptions = function(arr1, arr2) {
+                arr1 = arr1.filter( function( el ) {
+                  return arr2.indexOf( el ) < 0;
+                });
+            };
+        
+        $scope.init = function() {
+            if ($scope.selectedTenant) {
+
+                GBPEndpointServices.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+
+                loadEpgOptions();
+                /*loadL2ContextOptions();
+                loadL3ContextOptions();
+                loadSubnetOptions();*/
+                loadNetworkCotnaninemnt();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.addNewL3address = function() {
+            if($scope.newEndpointObj) {
+                if(!$scope.newEndpointObj['l3-address']){
+                    $scope.newEndpointObj['l3-address'] = [];
+                }
+                var objToPush = {'l3-context' : '', 'ip-address' : ''};
+                $scope.newEndpointObj['l3-address'].push(objToPush);
+            }
+        };
+
+        $scope.deleteNewL3address = function(index){
+            if($scope.newEndpointObj) {
+                $scope.newEndpointObj['l3-address'].splice(index, 1);
+            }
+        };
+
+        $scope.addNewLeafListEl = function(prop) {
+            if($scope.newEndpointObj) {
+                if(!$scope.newEndpointObj[prop]){
+                    $scope.newEndpointObj[prop] = [];
+                }
+                var objToPush = "";
+                $scope.newEndpointObj[prop].push(objToPush);
+            }
+        };
+
+        $scope.updateLeafListEl = function(index, value, prop) {
+            if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) {
+                $scope.newEndpointObj[prop][index] = value;
+            }
+        };
+
+        $scope.deleteNewLeafListEl = function(index, prop){
+            if($scope.newEndpointObj) {
+                $scope.newEndpointObj[prop].splice(index, 1);
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.endpointForm)){
+                GBPEndpointServices.send(path, $scope.newEndpointObj, function(data){
+                    $scope.init();
+                    $scope.view.endpoint = false;
+                    $scope.reloadNewObj();
+                    $scope.view.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedEndpoint) {
+                GBPEndpointServices.delete(path, $scope.selectedEndpoint, function(data){
+                    $scope.init();
+                    $scope.view.endpoint = false;
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.view.endpoint = true;
+            $scope.reloadNewObj();
+            $scope.selectedEndpoint = null;
+
+            $scope.view.edit = "add";
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedEndpoint = selectedObj;
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.endpoint = true;
+            }
+            else {
+                $scope.view.endpoint = false;
+                $scope.view.edit = "view";
+            }
+
+            if($scope.view.endpoint) {
+                angular.copy(selectedObj, $scope.newEndpointObj);
+            }
+        };
+
+        $scope.close = function(){
+            $scope.view.endpoint = false;
+            $scope.view.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEndpoint ) {
+                    $scope.view.endpoint = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedEndpoint, $scope.newEndpointObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_EPG_RELOAD',function(){
+            loadEpgOptions();
+        });
+
+        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){
+            //loadL2ContextOptions();
+            loadNetworkCotnaninemnt();
+        });
+
+        $scope.$on('GBP_L2FLOOD_RELOAD',function(){
+            //loadL2ContextOptions();
+            loadNetworkCotnaninemnt();
+        });
+
+        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){
+            //loadL3ContextOptions();
+            loadNetworkCotnaninemnt();
+        });
+
+        $scope.$on('GBP_SUBNET_RELOAD',function(){
+            //loadSubnetOptions();
+            loadNetworkCotnaninemnt();
+        });
+    }]);
+
+    gbp.register.controller('l3EndpointCtrl', ['$scope', 'GBPEndpointL3Services', 'GPBServices', 'GBPEpgServices', 'GBPL3ContextServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter',
+        function($scope, GBPEndpointL3Services, GPBServices, GBPEpgServices, GBPL3ContextServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){
+        $scope.list = [];
+        $scope.selectedEndpoint = null;
+        $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);
+        $scope.displayLabel = function(obj) {
+            return obj['ip-prefix'] + ':' + obj['l3-context'];
+        };
+        $scope.crudLabel = 'L3 Prefix endpoint list';
+
+        $scope.l2context = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context);
+
+        $scope.l3context = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context);
+
+        $scope.epg = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg);
+
+        $scope.view = {
+            endpoint: false,
+            edit: "view"
+        };
+
+        var path = null,
+            mandatoryProperties = [],
+
+            loadEpgOptions = function() {
+                $scope.epg.options = [];
+
+                path = GBPEpgServices.createPathObj($scope.selectedTenant.id);
+                GBPEpgServices.load(path, function(data){
+                    $scope.epg.options = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+            },
+
+            loadL2ContextOptions = function() {
+                $scope.l2context.options = [];
+
+                path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id);
+                    
+                GBPL2FloodDomainServices.load(path, function(data){
+                    $scope.l2context.options = $scope.l2context.options.concat(data);
+                }, function(){
+
+                });
+
+                path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id);
+                GBPL2BridgeDomainServices.load(path, function(data){
+                    $scope.l2context.options = $scope.l2context.options.concat(data);
+                }, function(){
+
+                });
+            },
+
+            loadL3ContextOptions = function(){
+                $scope.l3context.options = [];
+
+                GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){
+                    $scope.l3context.options = data;
+                }, function(){
+
+                });
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedEndpoint = null;
+                $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);
+                $scope.view = {
+                    endpoint: false,
+                    edit: "view"
+                };
+            };
+        
+        $scope.init = function() {
+            if ($scope.selectedTenant) {
+
+                GBPEndpointL3Services.load(path, function(data){
+                    $scope.list = data;
+                }, function(){
+                    //TODO: error cbk
+                });
+
+                loadEpgOptions();
+                loadL2ContextOptions();
+                loadL3ContextOptions();
+            }else{
+                clear();
+            }
+        };
+
+        $scope.addNewL2gateways = function() {
+            if($scope.newEndpointObj) {
+                if(!$scope.newEndpointObj['endpoint-l2-gateways']){
+                    $scope.newEndpointObj['endpoint-l2-gateways'] = [];
+                }
+                var objToPush = {'l2-context' : '', 'mac-address' : ''};
+                $scope.newEndpointObj['endpoint-l2-gateways'].push(objToPush);
+            }
+        };
+
+        $scope.deleteNewL2gateways = function(index){
+            if($scope.newEndpointObj) {
+                $scope.newEndpointObj['endpoint-l2-gateways'].splice(index, 1);
+            }
+        };
+
+        $scope.addNewL3gateways = function() {
+            if($scope.newEndpointObj) {
+                if(!$scope.newEndpointObj['endpoint-l3-gateways']){
+                    $scope.newEndpointObj['endpoint-l3-gateways'] = [];
+                }
+                var objToPush = {'l3-context' : '', 'ip-address' : ''};
+                $scope.newEndpointObj['endpoint-l3-gateways'].push(objToPush);
+            }
+        };
+
+        $scope.deleteNewL3gateways = function(index){
+            if($scope.newEndpointObj) {
+                $scope.newEndpointObj['endpoint-l3-gateways'].splice(index, 1);
+            }
+        };
+
+        $scope.addNewLeafListEl = function(prop) {
+            if($scope.newEndpointObj) {
+                if(!$scope.newEndpointObj[prop]){
+                    $scope.newEndpointObj[prop] = [];
+                }
+                var objToPush = "";
+                $scope.newEndpointObj[prop].push(objToPush);
+            }
+        };
+
+        $scope.updateLeafListEl = function(index, value, prop) {
+            if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) {
+                $scope.newEndpointObj[prop][index] = value;
+            }
+        };
+
+        $scope.deleteNewLeafListEl = function(index, prop){
+            if($scope.newEndpointObj) {
+                $scope.newEndpointObj[prop].splice(index, 1);
+            }
+        };
+
+        $scope.save = function(){
+            if($scope.validateForm($scope.l3EndpointForm)){
+                GBPEndpointL3Services.send(path, $scope.newEndpointObj, function(data){
+                    $scope.init();
+                    $scope.view.endpoint = false;
+                    $scope.reloadNewObj();
+                    $scope.view.edit = "view";
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedTenant && $scope.selectedEndpoint) {
+                GBPEndpointL3Services.delete(path, $scope.selectedEndpoint, function(data){
+                    $scope.init();
+                }, function(){
+                    //TODO: error cbk
+                });
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.view.endpoint = true;
+            $scope.reloadNewObj();
+            $scope.selectedEndpoint = null;
+            $scope.view.edit = "add";
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null);
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedEndpoint = selectedObj;
+            angular.copy(selectedObj, $scope.newEndpointObj);
+            $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view";
+            if(selectedObj){
+                $scope.view.endpoint = true;
+            }
+            else {
+                $scope.view.endpoint = false;
+                $scope.view.edit = "view";
+            }
+        };
+
+        $scope.close = function(){
+            $scope.view.endpoint = false;
+            $scope.view.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEndpoint ) {
+                    $scope.view.endpoint = true;
+                    $scope.view.edit = "edit";
+                    angular.copy($scope.selectedEndpoint, $scope.newEndpointObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_EPG_RELOAD',function(){
+            loadEpgOptions();
+        });
+
+        $scope.$on('GBP_L2BRIDGE_RELOAD',function(){
+            loadL2ContextOptions();
+        });
+
+        $scope.$on('GBP_L2FLOOD_RELOAD',function(){
+            loadL2ContextOptions();
+        });
+
+        $scope.$on('GBP_L3CONTEXT_RELOAD',function(){
+            loadL3ContextOptions();
+        });
+    }]);
+
+    gbp.register.controller('accessModelWizardCtrl', ['$scope', '$filter', 'GBPTenantServices', 'GBPEpgServices', 'GBPContractServices', 'GPBServices', function($scope, $filter, GBPTenantServices, GBPEpgServices, GBPContractServices, GPBServices){ 
+        $scope.wizardPage = null;
+
+        $scope.selectedTenant = null;
+        $scope.tenant = null;
+        //$scope.epgList = [];
+        $scope.newContractObj = null;
+
+        $scope.init = function() {
+            $scope.setPage('tenants');
+        };
+
+        $scope.setPage = function(pageName, object) {
+            $scope.wizardPage = pageName;
+
+            switch(pageName) {
+                case 'contracts':
+                    if(object) {
+                        $scope.tenant = object;
+                    }
+
+                    break;
+
+                case 'summary':
+                    $scope.tenant['endpoint-group'] = $scope.tenant['endpoint-group'] ? $scope.tenant['endpoint-group'] : [];
+
+                    if(object) {
+                        object.forEach(function(o) {
+                            $scope.tenant['endpoint-group'].push(GPBServices.stripNullValues(o));
+                        });
+                    }
+
+                    break;
+
+                 case 'epgs':
+                    $scope.tenant['contract'] = $scope.tenant['contract'] ? $scope.tenant['contract'] : [];
+
+                    if(object) {
+                        object.forEach(function(o) {
+                            $scope.tenant['contract'].push(GPBServices.stripNullValues(o));
+                        });
+                    }
+
+                    break;
+            }
+        };
+
+        $scope.submit = function(object) {
+            $scope.tenant['endpoint-group'] = $scope.tenant['endpoint-group'] ? $scope.tenant['endpoint-group'] : [];
+
+            if(object) {
+                object.forEach(function(o) {
+                    $scope.tenant['endpoint-group'].push(GPBServices.stripNullValues(o));
+                });
+            }
+
+            
+            path = GBPTenantServices.createPathObj($scope.tenant.id);
+            GBPTenantServices.send(path, $scope.tenant, function(data){
+                $scope.wizards.accessModelWizard = false;
+                $scope.sendReloadEventFromRoot('GBP_GLOBAL_TENANT_RELOAD');
+                $scope.reloadTopo();
+            }, function(){
+                //TODO: error cbk
+            });
+        };
+
+        // $scope.updateList = function(list, object, key) {
+        //     var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);
+
+        //     if(elementPos < 0) {
+        //         list.push(object);
+        //     }
+        //     else {
+        //         list[elementPos] = object;
+        //     }
+        // };
+    }]);
+
+    gbp.register.controller('wizardTenantCtrl', ['$scope', '$filter', 'GBPTenantServices', function($scope, $filter, GBPTenantServices){ 
+        // $scope.tenantList = [];
+        $scope.newTenantObj = GBPTenantServices.createObj();
+        $scope.displayLabel = ['name' , 'id'];
+
+        $scope.view = {
+            tenantEdit: false
+        };
+
+        // $scope.init = function() {
+        //     $scope.getTenants();
+        // };
+
+        // $scope.getTenants = function() {
+        //     GBPTenantServices.load(
+        //         function(data) {
+        //             $scope.tenantList = data;
+        //             $scope.newTenantObj = GBPTenantServices.createObj();
+        //         },
+        //         function(){
+        //             //TODO error
+        //         }
+        //     );
+        // };
+
+        $scope.reloadTenants = function(selectedObject) {
+            if(!selectedObject) {
+                selectedObject = GBPTenantServices.createObj();
+                 $scope.view.tenantEdit = false;
+            }
+            else {
+                $scope.view.tenantEdit = true;
+            }
+
+            $scope.selectedTenant = selectedObject;
+            $scope.newTenantObj = selectedObject;
+        };
+
+        $scope.getNewTenantObject = function() {
+            return GBPTenantServices.createObj();
+        };
+    }]); 
+
+    gbp.register.controller('wizardEpgCtrl', ['$scope', '$filter', 'GBPEpgServices', function($scope, $filter, GBPEpgServices){ 
+        $scope.list = [];
+        $scope.newEpgObj = GBPEpgServices.createObj();
+        $scope.selectedEpg = null;
+        $scope.epgFormView = true;
+
+        $scope.displayLabel = ['name', 'id'];
+        $scope.crudLabel = 'Group list';
+
+        $scope.igpOpts = ['allow', 'require-contract'];
+
+        $scope.init = function() {
+            
+        };
+
+        $scope.showForm = function() {
+            $scope.epgFormView = true;
+            $scope.newEpgObj = GBPEpgServices.createObj();
+        };
+
+        $scope.save = function() {
+            $scope.updateList($scope.list, $scope.newEpgObj, "id");
+            $scope.reload($scope.newEpgObj);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newEpgObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedEpg) {
+                var index = $scope.list.indexOf($scope.selectedEpg);
+                $scope.list.splice(index, 1);
+                $scope.epgFormView = false;
+            }
+            //$scope.newEpgObj = GBPEpgServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedEpg = selectedObj;
+            $scope.newEpgObj = selectedObj;
+            $scope.epgFormView = true;
+            $scope.$broadcast('WIZARD_EPG_RELOAD');
+        };
+
+        $scope.close = function() {
+            $scope.epgFormView = false;
+            $scope.newEpgObj = GBPEpgServices.createObj();
+            $scope.selectedEpg = null;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEpg ) {
+                    $scope.epgFormView = true;
+                    angular.copy($scope.selectedEpg, $scope.newEpgObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on("WIZARD_CNS_RELOAD", function(event, args){
+            //$scope.selectedEpg['consumer-named-selector'] = args;
+            $scope.newEpgObj['consumer-named-selector'] = args;
+            $scope.updateList($scope.list, $scope.newEpgObj, "id");
+        });
+
+        $scope.$on("WIZARD_PNS_RELOAD", function(event, args){
+            //$scope.selectedEpg['provider-named-selector'] = args;
+            $scope.newEpgObj['provider-named-selector'] = args;
+            $scope.updateList($scope.list, $scope.newEpgObj, "id");
+        });
+    }]); 
+
+    gbp.register.controller('wizardContractCtrl', ['$scope', '$filter', 'GBPContractServices', function($scope, $filter, GBPContractServices){ 
+        $scope.list = [];
+        $scope.newContractObj = GBPContractServices.createObj();
+        $scope.selectedContract = null;
+
+        $scope.displayLabel = ['description', 'id'];
+        $scope.crudLabel = 'Contract list';
+
+        $scope.contractFormView = true;
+
+        $scope.init = function() {
+            
+        };
+
+        $scope.showForm = function() {
+            $scope.contractFormView = true;
+            $scope.newContractObj = GBPContractServices.createObj();
+        };
+
+        $scope.save = function() {
+            $scope.updateList($scope.list, $scope.newContractObj, "id");
+            $scope.reload($scope.newContractObj);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newContractObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedContract) {
+                var index = $scope.list.indexOf($scope.selectedContract);
+                $scope.list.splice(index, 1);
+                $scope.contractFormView = false;
+                $scope.newContractObj = GBPContractServices.createObj();
+                $scope.selectedContract = null;
+            }
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedContract = selectedObj;
+            $scope.newContractObj = selectedObj;
+            $scope.contractFormView = true;
+        };
+
+        $scope.close = function() {
+            $scope.contractFormView = false;
+            //$scope.newContractObj = GBPContractServices.createObj();
+            //$scope.selectedContract = null;
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedContract ) {
+                    $scope.contractFormView = true;
+                    angular.copy($scope.selectedContract, $scope.newContractObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on("WIZARD_SUBJECT_RELOAD", function(event, args){
+            //$scope.selectedEpg['consumer-named-selector'] = args;
+            $scope.newContractObj['subject'] = args;
+            $scope.updateList($scope.list, $scope.newContractObj, "id");
+        });
+
+        $scope.$on("WIZARD_CLAUSE_RELOAD", function(event, args){
+            //$scope.selectedEpg['consumer-named-selector'] = args;
+            $scope.newContractObj['clause'] = args;
+            $scope.updateList($scope.list, $scope.newContractObj, "id");
+        });
+    }]); 
+
+    gbp.register.controller('wizardCnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){
+        $scope.list = [];
+        $scope.selectedCNS = null;
+        $scope.newCNSObj = GBPConNamedSelServices.createObj();
+        $scope.internalView = {
+            cns: false,
+            edit: "view"
+        };
+        $scope.displayLabel = 'name';
+        $scope.crudLabel = 'Consumer named selectors list';
+
+        $scope.contractList = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contractList);
+
+        var clear = function(){
+                $scope.list = [];
+                $scope.selectedCNS = null;
+                $scope.newCNSObj = GBPConNamedSelServices.createObj();
+                $scope.internalView = {
+                    cns: false,
+                    edit: "add"
+                };
+            };
+
+        //move to separate ctrl \/
+        $scope.addNewElem = function(templateObj) {
+            if($scope.newCNSObj && $scope.newCNSObj.contract) {
+                var objToPush = templateObj || "";
+                $scope.newCNSObj.contract.push(objToPush);
+            }
+        };
+
+        $scope.deleteElemAt = function(index) {
+            if($scope.newCNSObj && $scope.newCNSObj.contract) {
+                $scope.newCNSObj.contract.splice(index, 1);
+            }
+        };
+
+        $scope.updateAt = function(index, value) {
+            if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) {
+                $scope.newCNSObj.contract[index] = value;
+            }
+        };
+        //move to separate ctrl /\
+
+        $scope.init = function() {
+            clear();
+
+            if($scope.tenant && $scope.tenant['contract'].length>0) {
+                $scope.contractList.options = $scope.tenant['contract'];
+            }
+
+            if($scope.selectedEpg && $scope.selectedEpg['consumer-named-selector']) {
+                $scope.list = $scope.selectedEpg['consumer-named-selector'];
+            }
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newCNSObj, "name");
+            $scope.reload($scope.newCNSObj);
+            $scope.$emit('WIZARD_CNS_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newCNSObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedCNS) {
+                var index = $scope.list.indexOf($scope.selectedCNS);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    cns: false,
+                    edit: "add"
+                };
+                $scope.$emit('WIZARD_CNS_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.selectedCNS = null;
+            $scope.internalView.cns = true;
+            $scope.internalView.edit = "add";
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newCNSObj = GBPConNamedSelServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedCNS = selectedObj;
+            $scope.newCNSObj = selectedObj;
+            $scope.internalView.cns = true;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.cns = false;
+            //$scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEpg ) {
+                    $scope.internalView.cns = true;
+                    $scope.internalView.edit = "add";
+                    angular.copy($scope.selectedCNS, $scope.newCNSObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('WIZARD_EPG_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('wizardPnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){
+        $scope.list = [];
+        $scope.selectedPNS = null;
+        $scope.newPNSObj = GBPProNamedSelServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.crudLabel = 'Provider named selectors list';
+        $scope.internalView = {
+            pns: false,
+            edit: "view"
+        };
+
+        $scope.contractList = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contractList);
+
+        var clear = function(){
+                $scope.list = [];
+                $scope.selectedPNS = null;
+                $scope.newPNSObj = GBPProNamedSelServices.createObj();
+                $scope.internalView = {
+                    pns: false,
+                    edit: "view"
+                };
+            };
+
+        //move to separate ctrl \/
+        $scope.addNewElem = function(templateObj) {
+            if($scope.newPNSObj && $scope.newPNSObj.contract) {
+                var objToPush = templateObj || "";
+                $scope.newPNSObj.contract.push(objToPush);
+            }
+        };
+
+        $scope.deleteElemAt = function(index) {
+            if($scope.newPNSObj && $scope.newPNSObj.contract) {
+                $scope.newPNSObj.contract.splice(index, 1);
+            }
+        };
+
+        $scope.updateAt = function(index, value) {
+            if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) {
+                $scope.newPNSObj.contract[index] = value;
+            }
+        };
+        //move to separate ctrl /\
+
+        $scope.init = function() {
+            clear();
+
+            if($scope.tenant && $scope.tenant['contract'].length>0) {
+                $scope.contractList.options = $scope.tenant['contract'];
+            }
+
+            if($scope.selectedEpg && $scope.selectedEpg['provider-named-selector']) {
+                $scope.list = $scope.selectedEpg['provider-named-selector'];
+            }
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newPNSObj, "name");
+            $scope.reload($scope.newPNSObj);
+            $scope.$emit('WIZARD_PNS_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newPNSObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedPNS) {
+                var index = $scope.list.indexOf($scope.selectedPNS);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    pns: false,
+                    edit: "add"
+                };
+                $scope.$emit('WIZARD_PNS_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.selectedPNS = null;
+            $scope.internalView.pns = true;
+            $scope.internalView.edit = "add";
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newPNSObj = GBPProNamedSelServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedPNS = selectedObj;
+            $scope.newPNSObj = selectedObj;
+            $scope.internalView.pns = true;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.pns = false;
+            $scope.internalView.edit = "view";
+        };
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedEpg ) {
+                    $scope.internalView.pns = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedPNS, $scope.newPNSObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('WIZARD_EPG_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('wizardSubjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){
+        $scope.list = [];
+        $scope.selectedSubject = null;
+        $scope.newSubjectObj = GBPSubjectServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            subject : false,
+            edit : "view"
+        };
+        $scope.crudLabel = 'Subject list';
+        $scope.errors = {};
+
+
+        var path = null,
+            mandatoryProperties = ['order'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedSubject = null;
+                $scope.newSubjectObj = GBPSubjectServices.createObj();
+                $scope.internalView = {
+                    subject : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newSubjectObj, "name");
+            $scope.reload($scope.newSubjectObj);
+            $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newSubjectObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedSubject) {
+                var index = $scope.list.indexOf($scope.selectedSubject);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    subject: false,
+                    edit: "add"
+                };
+                $scope.reloadNewObj();
+                $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newSubjectObj = GBPSubjectServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedSubject = selectedObj;
+            $scope.newSubjectObj = selectedObj;
+            $scope.internalView.subject = true;
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.subject = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedSubject = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.subject = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedSubject ) {
+                    $scope.internalView.subject = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedSubject, $scope.newSubjectObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_CONTRACT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){
+            obj.labels = $scope.displayLabel;
+        });
+
+        $scope.$on("WIZARD_RULE_RELOAD", function(event, args){
+            //$scope.selectedEpg['consumer-named-selector'] = args;
+            $scope.newSubjectObj['rule'] = args;
+            $scope.updateList($scope.list, $scope.newSubjectObj, "id");
+            $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list);
+        });
+    }]);
+
+    gbp.register.controller('wizardRuleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){
+        $scope.list = [];
+        $scope.selectedRule = null;
+        $scope.newRuleObj = GBPRuleServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            rule : false,
+            edit : "view"
+        };
+        $scope.crudLabel = 'Rule list';
+        $scope.errors = {};
+
+        var path = null,
+            mandatoryProperties = ['order'],
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedRule = null;
+                $scope.newRuleObj = GBPRuleServices.createObj();
+                $scope.internalView = {
+                    rule : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newRuleObj, "name");
+            $scope.reload($scope.newRuleObj);
+            $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newRuleObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedRule) {
+                var index = $scope.list.indexOf($scope.selectedRule);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    rule: false,
+                    edit: "add"
+                };
+                $scope.reloadNewObj();
+                $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newRuleObj = GBPRuleServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedRule = selectedObj;
+            $scope.newRuleObj = selectedObj;
+            $scope.internalView.rule = true;
+            $scope.$broadcast('WIZARD_RULE_RELOAD');
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.rule = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedRule = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.rule = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedRule ) {
+                $scope.internalView.rule = true;
+                $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedRule, $scope.newRuleObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('GBP_SUBJECT_RELOAD',function(){
+            $scope.init();
+        });
+
+        $scope.$on("WIZARD_CLASREF_RELOAD", function(event, args){
+            $scope.newRuleObj['classifier-ref'] = args;
+            $scope.updateList($scope.list, $scope.newRuleObj, "name");
+            $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);
+        });
+
+        $scope.$on("WIZARD_ACTIONREF_RELOAD", function(event, args){
+            $scope.newRuleObj['action-ref'] = args;
+            $scope.updateList($scope.list, $scope.newRuleObj, "name");
+            $scope.$emit('WIZARD_RULE_RELOAD', $scope.list);
+        });
+    }]);
+
+    gbp.register.controller('wizardClauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', 
+        function($scope, GBPClauseServices, GBPSubjectServices){
+        $scope.list = [];
+        $scope.selectedClause = null;
+        $scope.newClauseObj = GBPClauseServices.createObj();
+        $scope.internalView = {
+            clause: false,
+            edit: "view"
+        };
+        $scope.displayLabel = 'name';
+        $scope.crudLabel = 'Clause list';
+
+        $scope.subjects = {'options' : [], 'labels' : null};
+        $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects);
+
+        var path = null,
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedClause = null;
+                $scope.newClauseObj = GBPClauseServices.createObj();
+                $scope.internalView = {
+                    clause: false,
+                    edit: "view"
+                };
+            };
+
+        //move to separate ctrl \/
+        $scope.addNewElem = function(templateObj) {
+            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {
+                $scope.init();
+                var objToPush = templateObj || "";
+                $scope.newClauseObj['subject-refs'].push(objToPush);
+            }
+        };
+
+        $scope.deleteElemAt = function(index) {
+            if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) {
+                $scope.newClauseObj['subject-refs'].splice(index, 1);
+            }
+        };
+
+        $scope.updateAt = function(index, value) {
+            if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) {
+                $scope.newClauseObj['subject-refs'][index] = value;
+            }
+        };
+        //move to separate ctrl /\
+
+        $scope.init = function() {
+            if($scope.selectedContract && $scope.selectedContract['subject'].length>0) {
+                $scope.subjects.options = $scope.selectedContract['subject'];
+            }
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newClauseObj, "name");
+            $scope.reload($scope.newClauseObj);
+            $scope.$emit('WIZARD_CLAUSE_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newClauseObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedClause) {
+                var index = $scope.list.indexOf($scope.selectedClause);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    clause: false,
+                    edit: "add"
+                };
+                $scope.$emit('WIZARD_CLAUSE_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newClauseObj = GBPClauseServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedClause = selectedObj;
+            $scope.newClauseObj = selectedObj;
+            $scope.internalView.clause = true;
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.clause = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedClause = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.clause = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedClause ) {
+                    $scope.internalView.clause = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedClause, $scope.newClauseObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('WIZARD_SUBJECT_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('wizardActionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){
+        $scope.list = [];
+        $scope.selectedActionRef = null;
+        $scope.newActionRefObj = GBPActionRefsServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            actionRef : false,
+            edit : "view"
+        };
+        $scope.crudLabel = 'Action ref list';
+
+        $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel};
+
+        var path = null,
+            mandatoryProperties = ['order'],
+
+            actionInstanceNamesLoad = function() {
+                if($scope.tenant) {
+                    var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.tenant.id);
+                    GBPActionInstanceServices.load(actionInstancePath, function(data){
+                        $scope.actionInstanceNames.options = data;
+                    },function(){
+                        //TODO: error cbk
+                    });
+                }
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedActionRef = null;
+                $scope.newActionRefObj = GBPActionRefsServices.createObj();
+                $scope.internalView = {
+                    actionRef : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            actionInstanceNamesLoad();
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newActionRefObj, "name");
+            $scope.reload($scope.newActionRefObj);
+            $scope.$emit('WIZARD_ACTIONREF_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newActionRefObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedActionRef) {
+                var index = $scope.list.indexOf($scope.selectedActionRef);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    actionRef: false,
+                    edit: "add"
+                };
+                $scope.$emit('WIZARD_ACTIONREF_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newActionRefObj = GBPActionRefsServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedActionRef = selectedObj;
+            $scope.newActionRefObj = selectedObj;
+            $scope.internalView.actionRef = true;
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.actionRef = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedActionRef = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.actionRef = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedActionRef ) {
+                    $scope.internalView.actionRef = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedActionRef, $scope.newActionRefObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('WIZARD_RULE_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('wizardClassifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){
+        $scope.list = [];
+        $scope.selectedClassifierRef = null;
+        $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();
+        $scope.displayLabel = 'name';
+        $scope.internalView = {
+            classifierRef : false,
+            edit : "view"
+        };
+
+        $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel};
+
+        $scope.formDirections = ['in', 'out', 'bidirectional'];
+        $scope.formConnectionTracking = ['normal', 'reflexive'];
+
+        $scope.crudLabel = 'Classifier ref list';
+
+        var path = null,
+
+            instanceNamesLoad = function() {
+                if($scope.tenant) {
+                    var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.tenant.id);
+                    GBPClassifierInstanceServices.load(classifierInstancePath, function(data){
+                        $scope.instanceNames.options = data;
+                    },function(){
+                        //TODO: error cbk
+                    });
+                }
+            },
+
+            clear = function(){
+                $scope.list = [];
+                $scope.selectedClassifierRef = null;
+                $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();
+                $scope.internalView = {
+                    classifierRef : false,
+                    edit : "view"
+                };
+            };
+
+        $scope.init = function() {
+            instanceNamesLoad();
+        };
+
+        $scope.save = function(){
+            $scope.updateList($scope.list, $scope.newClassifierRefObj, "name");
+            $scope.reload($scope.newClassifierRefObj);
+            $scope.$emit('WIZARD_CLASREF_RELOAD', $scope.list);
+            $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newClassifierRefObj);
+        };
+
+        $scope.delete = function() {
+            if($scope.selectedClassifierRef) {
+                var index = $scope.list.indexOf($scope.selectedClassifierRef);
+                $scope.list.splice(index, 1);
+                $scope.internalView = {
+                    classifierRef: false,
+                    edit: "add"
+                };
+                $scope.$emit('WIZARD_CLASREF_RELOAD', $scope.list);
+            }
+        };
+
+        $scope.reloadNewObj = function() {
+            $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj();
+        };
+
+        $scope.reload = function(selectedObj) {
+            $scope.selectedClassifierRef = selectedObj;
+            $scope.newClassifierRefObj = selectedObj;
+            $scope.internalView.classifierRef = true;
+        };
+
+        $scope.showForm = function() {
+            $scope.reloadNewObj();
+            $scope.internalView.classifierRef = true;
+            $scope.internalView.edit = "add";
+            $scope.selectedClassifierRef = null;
+        };
+
+        $scope.close = function(){
+            $scope.internalView.classifierRef = false;
+            $scope.internalView.edit = "view";
+        };
+
+        $scope.$on('PGN_EDIT_ELEM', function(event){
+            if (!event.defaultPrevented) {
+                if ( $scope.selectedClassifierRef ) {
+                    $scope.internalView.classifierRef = true;
+                    $scope.internalView.edit = "edit";
+                    angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj);
+                }
+                event.defaultPrevented = true;
+            }
+        });
+
+        $scope.$on('WIZARD_RULE_RELOAD',function(){
+            $scope.init();
+        });
+    }]);
+
+    gbp.register.controller('rendererStateCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){
+        $scope.data = {'subject-feature-definitions' : {}};
+        $scope.view_path = 'src/app/gbp/views/governance';
+
+        var init = function(){
+            GPBServices.getDefinitions(function(classifiersDefs, actionsDefs){
+                $scope.data['subject-feature-definitions']['classifier-definition'] = classifiersDefs;
+                $scope.data['subject-feature-definitions']['action-definition'] = actionsDefs;
+            }, function(){
+                //error
+            });
+        };
+        
+        init();
+    }]);
+
+    gbp.register.controller('layerCtrl', ['$scope', function($scope){
+
+        var moveOffset = 1;
+        $scope.currentDisplayIndex = 1;
+        $scope.displayOffsets = [-1, 0, 1];
+        $scope.expanded = true;
+
+        $scope.init = function(key, value){
+            $scope.data = value;
+            if($scope.checkData(value, 'Array')){
+                $scope.setActData($scope.data[$scope.data.length - 1]);
+            }
+        }; 
+
+        $scope.toggleExpanded = function(){
+            $scope.expanded = !$scope.expanded;
+        };
+
+        $scope.shiftDisplayNext = function() {
+            $scope.currentDisplayIndex = Math.min($scope.currentDisplayIndex + moveOffset, $scope.data.length - 2);
+        };
+
+        $scope.shiftDisplayPrev = function() {
+            $scope.currentDisplayIndex = Math.max($scope.currentDisplayIndex - moveOffset, 1);
+        };
+
+        $scope.showPrevButton = function() {
+            return $scope.currentDisplayIndex > 1;
+        };
+
+        $scope.showNextButton = function() {
+            return $scope.data && $scope.currentDisplayIndex < $scope.data.length - 2;
+        };
+
+        $scope.setActData = function(data) {
+            $scope.actSelected = data;
+        };
+
+        $scope.checkData = function(data, type){
+            var result = {'Array' : data instanceof Array,
+                        'Object' : data instanceof Object};
+
+            return result[type];
+        };
+    }]);
+
+    gbp.register.controller('actionReferenceWizardCtrl', ['$scope', '$filter', 'GBPRuleServices', 'GBPActionInstanceServices', function($scope, $filter, GBPRuleServices, GBPActionInstanceServices){ 
+        $scope.wizardPage = null;
+        $scope.path = {};
+        $scope.rule = {};
+
+        $scope.actionInstanceNames = {'options' : [], 'labels' : "name"};
+
+        var actionInstanceNamesLoad = function() {
+            var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);
+            GBPActionInstanceServices.load(actionInstancePath, function(data){
+                $scope.actionInstanceNames.options = data;
+            },function(){
+                //TODO: error cbk
+            });
+        };
+
+        $scope.init = function() {
+            $scope.setPage('reference');
+        };
+
+        $scope.setPage = function(pageName, object) {
+            $scope.wizardPage = pageName;
+        };
+
+        $scope.submit = function() {
+            //if($scope.validateForm($scope.actionsForm)){
+                $scope.actionInstanceNames.options.forEach(function(i) {
+                    path = GBPActionInstanceServices.createPathObj($scope.path.tenantId, i.name);
+                //saveParams();
+
+                    GBPActionInstanceServices.send(path, i, function(data){
+                    $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');
+                    }, function(){
+                        //TODO: error cbk
+                    });
+                });
+                
+            //}
+
+            //if($scope.validateForm($scope.rulesForm)){
+                path = GBPRuleServices.createPathObj($scope.path.tenantId, $scope.path.contractId, $scope.path.subjectId, $scope.path.ruleId);
+                GBPRuleServices.send(path, $scope.rule, function(data){
+
+                    $scope.wizards.actionReferenceWizard = false;
+                    
+                    //$scope.sendReloadEventFromRoot('GBP_TENANT_RELOAD');
+                }, function(){
+                    //TODO: error cbk
+                });
+            //}
+            //$scope.
+        };
+
+        $scope.$on('ACTION_RULE_WIZARD_LOAD', function(event, data){
+            $scope.rule = angular.copy(data.data);
+            $scope.path = data.path;
+        });
+
+        $scope.$on('WIZARD_ACTIONREF_ADD', function(event, data){
+            if(!$scope.rule['action-ref']) {
+                $scope.rule['action-ref'] = [];
+            }
+            $scope.updateList($scope.rule['action-ref'], data, "name");
+        });
+
+        $scope.$on('WIZARD_ACTIONREF_DELETE', function(event, data){
+            $scope.rule['action-ref'].splice(data, 1);
+        });
+
+        $scope.$on('WIZARD_ACTIONINSTANCE_ADD', function(event, data){
+            $scope.updateList($scope.actionInstanceNames.options, data, "name");
+
+            $scope.setPage('reference');
+        });
+
+        $scope.$on('GBP_TENANT_RELOAD',function(){
+            actionInstanceNamesLoad();
+        });
+
+    }]);
+
+    gbp.register.controller('actionsRefListCtrl', ['$scope', '$filter', function($scope, $filter){ 
+        
+        $scope.actionReferenceForm = false;
+
+        $scope.showForm = function(object) {
+            $scope.actionReferenceForm = true;
+            $scope.newActionRefObj = object || null;
+        };
+
+        $scope.closeForm = function() {
+            $scope.actionReferenceForm = false;
+        };
+
+        $scope.save = function(){
+            $scope.$emit('WIZARD_ACTIONREF_ADD', $scope.newActionRefObj);
+            $scope.resetObject();
+        };
+
+        $scope.deleteElemAt = function(index) {
+            $scope.$emit('WIZARD_ACTIONREF_DELETE', index);
+            $scope.resetObject();
+        };
+
+        $scope.resetObject = function() {
+            $scope.newActionRefObj = null;
+        };
+
+        
+
+    }]);
+
+    gbp.register.controller('actionInstanceWizardCtrl', ['$scope', '$filter', 'GPBServices', 'GBPActionInstanceServices', function($scope, $filter, GPBServices, GBPActionInstanceServices){ 
+        $scope.actionDefinitions = {'options' : [], 'labels' : "name"};
+        $scope.newActionObj = GBPActionInstanceServices.createObj();
+
+        var loadDefinitions = function() {
+            GPBServices.getDefinitions(function(classifierDefs, actionDefs) {
+                $scope.actionDefinitions.options = actionDefs;
+                //$scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions);
+            });
+        };
+
+        $scope.reloadDefs = function(){
+            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id']));
+
+            //TODO: rework
+            if($scope.defs.length && $scope.defs[0].name === 'sfc-chain-name') {
+                GPBServices.getServiceFunctionChains(function(data) {
+                    $scope.serviceFunctionChains = data;
+                });
+            }
+        };
+
+        $scope.getDefinitionObjParams = function(id){
+            return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id);
+        };
+
+        $scope.save = function(){
+            $scope.newActionObj['parameter-value'] = [];
+            $scope.$broadcast('GBP_SAVE_PARAM');
+            $scope.$emit('WIZARD_ACTIONINSTANCE_ADD', $scope.newActionObj);
+            $scope.resetObject();
+        };
+
+        $scope.resetObject = function() {
+            $scope.newActionObj = GBPActionInstanceServices.createObj();
+        };
+
+        $scope.saveParam = function() {
+            
+        };
+
+        $scope.addParam = function(name, type, value) {
+            $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));
+        };
+
+        loadDefinitions();
+
+    }]);
+
+});
+
+