Merge "Use AAAShiroFilter as TokenAuthFilter was deprecated in Be"
authorKeith Burns <alagalah@gmail.com>
Mon, 2 May 2016 12:56:13 +0000 (12:56 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 2 May 2016 12:56:13 +0000 (12:56 +0000)
92 files changed:
artifacts/pom.xml
features/pom.xml
features/src/main/features/features.xml
groupbasedpolicy-old-ui/bundle/pom.xml [moved from groupbasedpolicy-ui/bundle/pom.xml with 88% similarity, mode: 0644]
groupbasedpolicy-old-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml [moved from groupbasedpolicy-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/pom.xml [moved from groupbasedpolicy-ui/module/pom.xml with 82% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.controller.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.css [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.css with 95% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.less [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less with 94% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.module.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.module.js with 96% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.services.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/infinity-loop.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/infinity-loop.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-arrow-down.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-arrow-down.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-arrow-right.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-arrow-right.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-arrow-up.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-arrow-up.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-close.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-close.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-collapse-bits.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-collapse-bits.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-danger.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-danger.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-expand-bits.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-expand-bits.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-fill-data.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-fill-data.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-filter-empty.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-filter-empty.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-filter-full-bck.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-filter-full-bck.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-filter-full.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-filter-full.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-list-bck.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-list-bck.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-list.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-list.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-next.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-next.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-plus.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-plus.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-prev.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-prev.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-question.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-question.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-view.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/images/yang-ui-icons/icon-view.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/js/backbone-min.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/js/backbone-min.js with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/js/geometry.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/js/geometry.js with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/js/joint.clean.build.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/js/joint.clean.build.js with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/js/joint.css [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/js/joint.css with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/js/lodash.min.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/js/lodash.min.js with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/js/vectorizer.js [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/js/vectorizer.js with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/action-ref.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/action-ref.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/actions.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/actions.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/box/contract-content-static.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/box/contract-content-static.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/box/ep-content-static.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/box/ep-content-static.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/box/epg-content-static.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/box/epg-content-static.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/box/rule-content-static.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/box/rule-content-static.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/box/subject-content-static.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/box/subject-content-static.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/classifier-ref.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifier-ref.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/classifiers.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifiers.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/clause.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/clause.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/cns.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/cns.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/contracts.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/contracts.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/docs.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/docs.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/endpoint.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/endpoint.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/epg.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/epg.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/gateway.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/gateway.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/delivered-policy.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/delivered-policy.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/epg-detail.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/epg-detail.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/expressed-policy.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/expressed-policy.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/main.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/main.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/node-structure.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/node-structure.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/renderer-configuration.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/renderer-configuration.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/renderer-state.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/renderer-state.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/governance/subject-detail.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/governance/subject-detail.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/index.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/l2l3.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/l2l3.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/l3-endpoint.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/l3-endpoint.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/main/governance.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/main/governance.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/main/main.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/main/main.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/main/policy-renderer.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/main/policy-renderer.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/menu/main-menu.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/menu/main-menu.tpl.html with 99% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/parts/breadcrumbs.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/breadcrumbs.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/parts/crud-endpoint.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/crud-endpoint.tpl.html with 97% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/parts/crud.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/crud.tpl.html with 96% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/parts/param.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/param.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/pns.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/pns.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/prefix.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/prefix.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/root.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/root.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/rules.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/rules.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/subjects.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/subjects.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/tenants.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/tenants.tpl.html with 98% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/wizards/accessModelWizard.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/wizards/accessModelWizard.tpl.html with 100% similarity, mode: 0644]
groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/wizards/actionReferenceWizard.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/views/wizards/actionReferenceWizard.tpl.html with 100% similarity]
groupbasedpolicy-old-ui/pom.xml [moved from groupbasedpolicy-ui/pom.xml with 90% similarity, mode: 0644]
pom.xml
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/SxpMapperProviderImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/SxpMapperReactorImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/dao/EPForwardingTemplateDaoImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/dao/EPPolicyTemplateDaoImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/dao/MasterDatabaseBindingDaoImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/listen/EPForwardingTemplateListenerImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/listen/EPPolicyTemplateListenerImpl.java
sxp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/listen/MasterDatabaseBindingListenerImpl.java
sxp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/SxpMapperReactorImplTest.java
sxp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/dao/EPPolicyTemplateDaoImplTest.java
sxp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/sxp/mapper/impl/dao/MasterDatabaseBindingDaoImplTest.java

index 07d2a4beb5e4968ed793a293d88b53787bcae46f..d07f73538aa0ca6a46382b2740ab323fff13acd3 100755 (executable)
@@ -63,7 +63,7 @@
       </dependency>
       <dependency>
         <groupId>${project.groupId}</groupId>
-        <artifactId>groupbasedpolicy-ui-bundle</artifactId>
+        <artifactId>groupbasedpolicy-old-ui-bundle</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
index 305fea44f9c2f5d0f0cdaa288c06527c9b44fd00..f372d0e63366ea216c5bbef2646832d980e40fd0 100755 (executable)
     </dependency>
     <dependency>
       <groupId>org.opendaylight.groupbasedpolicy</groupId>
-      <artifactId>groupbasedpolicy-ui-bundle</artifactId>
+      <artifactId>groupbasedpolicy-old-ui-bundle</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.groupbasedpolicy</groupId>
index f2e915f514e6a7e858a2303a8175d93f8ad900af..fa874ea917419d008e397a2cbfc6dbd220ebdfe5 100755 (executable)
         <feature version="${dlux.version}">odl-dlux-core</feature>
         <feature version="${dlux.version}">odl-dlux-yangvisualizer</feature>
         <feature version="${project.version}">odl-groupbasedpolicy-uibackend</feature>
-        <bundle>mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-ui-bundle/{{VERSION}}</bundle>
+        <bundle>mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-old-ui-bundle/{{VERSION}}</bundle>
     </feature>
 
     <!--
old mode 100755 (executable)
new mode 100644 (file)
similarity index 88%
rename from groupbasedpolicy-ui/bundle/pom.xml
rename to groupbasedpolicy-old-ui/bundle/pom.xml
index 470e69a..ed7985f
@@ -1,86 +1,86 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-  <modelVersion>4.0.0</modelVersion>\r
- <parent>\r
-    <groupId>org.opendaylight.groupbasedpolicy</groupId>\r
-    <artifactId>groupbasedpolicy-ui</artifactId>\r
-    <version>0.4.0-SNAPSHOT</version>\r
-  </parent>\r
-\r
-  <artifactId>groupbasedpolicy-ui-bundle</artifactId>\r
-  <name>groupbasedpolicy-ui-bundle</name>\r
-  <packaging>bundle</packaging>\r
-\r
-    <properties>\r
-        <dlux.version>0.4.0-SNAPSHOT</dlux.version>\r
-    </properties>\r
-\r
-  <dependencies>\r
-    <dependency>\r
-      <groupId>org.opendaylight.dlux</groupId>\r
-      <artifactId>loader</artifactId>\r
-        <version>${dlux.version}</version>\r
-    </dependency>\r
-     <dependency>\r
-      <groupId>org.opendaylight.groupbasedpolicy</groupId>\r
-      <artifactId>groupbasedpolicy-ui-module</artifactId>\r
-      <version>${project.version}</version>\r
-    </dependency>\r
-  </dependencies>\r
- <build>\r
-   <resources>\r
-      <resource>\r
-        <directory>target/generated-resources</directory>\r
-      </resource>\r
-      <resource>\r
-        <directory>src/main/resources</directory>\r
-      </resource>\r
-    </resources>\r
-    <plugins>\r
-     <plugin>\r
-        <groupId>org.apache.maven.plugins</groupId>\r
-        <artifactId>maven-dependency-plugin</artifactId>\r
-        <version>2.6</version>\r
-        <executions>\r
-     <!--loader Resources-->\r
-          <execution>\r
-            <id>unpack-loader-resources</id>\r
-            <goals>\r
-              <goal>unpack-dependencies</goal>\r
-            </goals>\r
-            <phase>generate-resources</phase>\r
-            <configuration>\r
-              <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>\r
-              <groupId>org.opendaylight.dlux</groupId>\r
-              <includeArtifactIds>groupbasedpolicy-ui-module</includeArtifactIds>\r
-              <excludes>META-INF\/**</excludes>\r
-              <excludeTransitive>true</excludeTransitive>\r
-              <ignorePermissions>false</ignorePermissions>\r
-            </configuration>\r
-          </execution>\r
-        </executions>\r
-      </plugin>\r
-      <plugin>\r
-        <groupId>org.apache.felix</groupId>\r
-        <artifactId>maven-bundle-plugin</artifactId>\r
-        <extensions>true</extensions>\r
-        <configuration>\r
-          <instructions>\r
-            <Import-Package>org.osgi.service.http,\r
-                            org.osgi.framework;version="1.0.0",\r
-                            org.opendaylight.dlux.loader,\r
-                            org.slf4j\r
-            </Import-Package>\r
-            <Export-Package></Export-Package>\r
-          </instructions>\r
-        </configuration>\r
-      </plugin>\r
-    </plugins>\r
-  </build>\r
-  <scm>\r
-    <connection>scm:git:ssh://git.opendaylight.org:29418/dlux.git</connection>\r
-    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/dlux.git</developerConnection>\r
-    <tag>HEAD</tag>\r
-    <url>https://wiki.opendaylight.org/view/OpenDaylight_dlux:Main</url>\r
-  </scm>\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+ <parent>
+    <groupId>org.opendaylight.groupbasedpolicy</groupId>
+    <artifactId>groupbasedpolicy-old-ui</artifactId>
+    <version>0.4.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>groupbasedpolicy-old-ui-bundle</artifactId>
+  <name>groupbasedpolicy-old-ui-bundle</name>
+  <packaging>bundle</packaging>
+
+    <properties>
+        <dlux.version>0.4.0-SNAPSHOT</dlux.version>
+    </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.dlux</groupId>
+      <artifactId>loader</artifactId>
+        <version>${dlux.version}</version>
+    </dependency>
+     <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>groupbasedpolicy-old-ui-module</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+ <build>
+   <resources>
+      <resource>
+        <directory>target/generated-resources</directory>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+    </resources>
+    <plugins>
+     <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <version>2.6</version>
+        <executions>
+     <!--loader Resources-->
+          <execution>
+            <id>unpack-loader-resources</id>
+            <goals>
+              <goal>unpack-dependencies</goal>
+            </goals>
+            <phase>generate-resources</phase>
+            <configuration>
+              <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
+              <groupId>org.opendaylight.dlux</groupId>
+              <includeArtifactIds>groupbasedpolicy-old-ui-module</includeArtifactIds>
+              <excludes>META-INF\/**</excludes>
+              <excludeTransitive>true</excludeTransitive>
+              <ignorePermissions>false</ignorePermissions>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Import-Package>org.osgi.service.http,
+                            org.osgi.framework;version="1.0.0",
+                            org.opendaylight.dlux.loader,
+                            org.slf4j
+            </Import-Package>
+            <Export-Package></Export-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <scm>
+    <connection>scm:git:ssh://git.opendaylight.org:29418/dlux.git</connection>
+    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/dlux.git</developerConnection>
+    <tag>HEAD</tag>
+    <url>https://wiki.opendaylight.org/view/OpenDaylight_dlux:Main</url>
+  </scm>
+</project>
@@ -1,19 +1,19 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">\r
-    <reference id="httpService" availability="mandatory" activation="eager" interface="org.osgi.service.http.HttpService"/>\r
-    <reference id="loader" availability="mandatory" activation="eager" interface="org.opendaylight.dlux.loader.DluxModuleLoader"/>\r
-    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.opendaylight.dlux.loader.DluxModule">\r
-        <property name="httpService" ref="httpService"/>\r
-        <property name="loader" ref="loader"/>\r
-        <property name="moduleName" value="gbp"/>\r
-        <property name="url" value="/src/app/gbp"/>\r
-        <property name="directory" value="/gbp"/>\r
-        <property name="requireJs" value="app/gbp/gbp.module"/>\r
-        <property name="angularJs" value="app.gbp"/>\r
-               <property name="cssDependencies">\r
-            <list>\r
-                 <value>src/app/gbp/gbp.css</value>\r
-                 <value>src/app/gbp/js/joint.css</value>\r
-            </list>\r
-        </property>\r
-    </bean>\r
-</blueprint>\r
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+    <reference id="httpService" availability="mandatory" activation="eager" interface="org.osgi.service.http.HttpService"/>
+    <reference id="loader" availability="mandatory" activation="eager" interface="org.opendaylight.dlux.loader.DluxModuleLoader"/>
+    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.opendaylight.dlux.loader.DluxModule">
+        <property name="httpService" ref="httpService"/>
+        <property name="loader" ref="loader"/>
+        <property name="moduleName" value="gbp"/>
+        <property name="url" value="/src/app/gbp"/>
+        <property name="directory" value="/gbp"/>
+        <property name="requireJs" value="app/gbp/gbp.module"/>
+        <property name="angularJs" value="app.gbp"/>
+               <property name="cssDependencies">
+            <list>
+                 <value>src/app/gbp/gbp.css</value>
+                 <value>src/app/gbp/js/joint.css</value>
+            </list>
+        </property>
+    </bean>
+</blueprint>
old mode 100755 (executable)
new mode 100644 (file)
similarity index 82%
rename from groupbasedpolicy-ui/module/pom.xml
rename to groupbasedpolicy-old-ui/module/pom.xml
index 8060b15..37da5b7
   <modelVersion>4.0.0</modelVersion>
  <parent>
     <groupId>org.opendaylight.groupbasedpolicy</groupId>
-    <artifactId>groupbasedpolicy-ui</artifactId>
+    <artifactId>groupbasedpolicy-old-ui</artifactId>
     <version>0.4.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>groupbasedpolicy-ui-module</artifactId>
+  <artifactId>groupbasedpolicy-old-ui-module</artifactId>
   <name>${project.artifactId}</name>
-  <description>GBP UI Module Resources</description>
+  <description>GBP Old UI Module Resources</description>
   <packaging>jar</packaging>
 
 </project>
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();
+
+    }]);
+
+});
+
+
old mode 100755 (executable)
new mode 100644 (file)
similarity index 95%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.css
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.css
index fb2b1f7..ecd0d75
-.pl0 {\r
-  padding-left: 0 !important;\r
-}\r
-.pr0 {\r
-  padding-right: 0 !important;\r
-}\r
-.mt10 {\r
-  margin-top: 10px;\r
-}\r
-.mt20 {\r
-  margin-top: 20px;\r
-}\r
-.mt30 {\r
-  margin-top: 30px;\r
-}\r
-.mt40 {\r
-  margin-top: 40px;\r
-}\r
-.mb50 {\r
-  margin-bottom: 50px;\r
-}\r
-.mb0 {\r
-  margin-bottom: 0px !important;\r
-}\r
-.ml10 {\r
-  margin-left: 10px !important;\r
-}\r
-.ml20 {\r
-  margin-left: 20px !important;\r
-}\r
-.ml30 {\r
-  margin-left: 30px !important;\r
-}\r
-.maxHeight500 {\r
-  max-height: 500px;\r
-  overflow-y: scroll;\r
-}\r
-.gbpGlobalWrapper {\r
-  background: #f5f5f5;\r
-  margin-bottom: 0!important;\r
-  min-height: 100%;\r
-  padding-bottom: 60px;\r
-}\r
-.gbpGlobalWrapper span,\r
-.gbpGlobalWrapper label {\r
-  color: #393939;\r
-}\r
-.gbpGlobalWrapper h2 {\r
-  color: #666;\r
-}\r
-.gbpGlobalWrapper .form-control,\r
-.gbpGlobalWrapper .main input[type="text"] {\r
-  background: #fff;\r
-  color: #858585;\r
-}\r
-.gbpGlobalWrapper .form-control[disabled],\r
-.gbpGlobalWrapper .main input[type="text"][disabled] {\r
-  background: #eeeeee;\r
-}\r
-.gbpGlobalWrapper .form-control.narrow-input-left {\r
-  width: 45%;\r
-  float: left;\r
-}\r
-.gbpGlobalWrapper .form-control.narrow-input-right {\r
-  width: 45%;\r
-  float: right;\r
-}\r
-.gbpGlobalWrapper .row-param {\r
-  margin-bottom: 15px;\r
-  float: left;\r
-}\r
-.gbpGlobalWrapper .param-label {\r
-  width: 100%;\r
-  float: left;\r
-}\r
-.gbpGlobalWrapper .ep-filter {\r
-  margin-bottom: 20px;\r
-}\r
-.gbpGlobalWrapper .ep-filter DIV {\r
-  width: 48%;\r
-}\r
-.gbpGlobalWrapper .float-left {\r
-  float: left;\r
-}\r
-.gbpGlobalWrapper .float-right {\r
-  float: right;\r
-}\r
-.gbpGlobalWrapper .full-width {\r
-  width: 100%;\r
-}\r
-.gbpGlobalWrapper .full-width .btn {\r
-  width: 50px;\r
-}\r
-.gbpGlobalWrapper .full-width label {\r
-  margin-top: 10px;\r
-}\r
-.gbpWrapper .btn-primary {\r
-  color: #ffffff;\r
-  background-color: #428bca;\r
-  border-color: #357ebd;\r
-  font-weight: normal;\r
-}\r
-.gbpWrapper .btn-primary:hover {\r
-  background-color: #1BAAFD;\r
-  border-color: #1BAAFD;\r
-}\r
-.gbpWrapper .btn-primary.bottom-buttons {\r
-  bottom: 0;\r
-  position: absolute;\r
-  margin-bottom: 0 !important;\r
-  background-color: #FF7300;\r
-  border-color: #FF7300;\r
-  width: 45%;\r
-}\r
-.gbpWrapper .btn-primary.bottom-buttons.back {\r
-  right: 0;\r
-  margin-right: 15px;\r
-}\r
-.gbpWrapper .btn-primary.bottom-buttons.home {\r
-  left: 0;\r
-  margin-left: 15px;\r
-}\r
-.gbpWrapper .btn-primary.bottom-buttons:hover {\r
-  background-color: #FF8f33;\r
-  border-color: #FF8f33;\r
-}\r
-.gbpWrapper .btn-primary.bottom-buttons.full-width {\r
-  width: calc(100% - 30px);\r
-  left: 0;\r
-  margin-left: 15px;\r
-}\r
-.gbpWrapper .btn-primary.bottom-buttons.wizard-button {\r
-  bottom: 40px;\r
-}\r
-.gbpWrapper .btn-primary.btn-big {\r
-  padding: 20px;\r
-  font-size: 1.5em;\r
-  white-space: normal;\r
-}\r
-.gbpWrapper .noPadding {\r
-  padding: 0!important;\r
-}\r
-.gbpWrapper .basicLabel {\r
-  padding: 0;\r
-  font-weight: normal;\r
-}\r
-.gbpWrapper .rowWrapper {\r
-  margin-bottom: 5px;\r
-}\r
-.gbpWrapper .inline-block {\r
-  display: inline-block;\r
-}\r
-.gbpWrapper #graph {\r
-  overflow: auto;\r
-  width: 100%;\r
-  height: 100%;\r
-}\r
-.gbpWrapper .graphWrapper {\r
-  position: relative;\r
-}\r
-.gbpWrapper .graphWrapper .controlPanelButtons {\r
-  position: absolute;\r
-  top: 50px;\r
-  right: 0px;\r
-}\r
-.gbpWrapper .graphWrapper .controlPanelButtons .line {\r
-  margin: 5px 0;\r
-}\r
-.gbpWrapper .graphWrapper .btn {\r
-  min-width: 22px;\r
-  line-height: 22px;\r
-  text-align: center;\r
-  padding: 0!important;\r
-}\r
-.gbpWrapper .simpleBox {\r
-  -webkit-border-radius: 5px;\r
-  -moz-border-radius: 5px;\r
-  -ms-border-radius: 5px;\r
-  -o-border-radius: 5px;\r
-  border-radius: 5px;\r
-  border: 1px solid #e5e5e5;\r
-  background: #fff;\r
-  padding: 20px;\r
-}\r
-.gbpWrapper .simpleBox h2 {\r
-  margin-top: 0;\r
-}\r
-.gbpWrapper .sectionTitle {\r
-  padding: 20px;\r
-}\r
-.gbpWrapper .sectionTitle label {\r
-  font-size: 25px;\r
-}\r
-.gbpWrapper .legendBox {\r
-  position: absolute;\r
-  top: 50px;\r
-  right: 50px;\r
-  z-index: 10;\r
-}\r
-.gbpWrapper .legendBox ul {\r
-  padding: 0;\r
-  list-style: none;\r
-}\r
-.gbpWrapper .legendBox ul .item {\r
-  padding-top: 5px;\r
-  margin-bottom: 10px;\r
-}\r
-.gbpWrapper .legendBox ul .line {\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-  margin: 9px 5px 0 0;\r
-  width: 50px;\r
-}\r
-.gbpWrapper .legendBox ul .line.blue {\r
-  border-top: 2px solid blue;\r
-}\r
-.gbpWrapper .legendBox ul .line.green {\r
-  border-top: 2px solid green;\r
-}\r
-.gbpWrapper .mainNavigationWrapper {\r
-  padding-bottom: 50px;\r
-  overflow-x: scroll;\r
-}\r
-.gbpWrapper .mainNavigation {\r
-  padding-top: 5%;\r
-  min-width: 1450px;\r
-}\r
-.gbpWrapper .mainNavigation .topButtonsWrapper,\r
-.gbpWrapper .mainNavigation .bottomButtonsWrapper {\r
-  text-align: center;\r
-  width: 400px;\r
-  margin: 0 auto 15px;\r
-  padding: 0 0 20px;\r
-  border-bottom: 5px solid #393939;\r
-}\r
-.gbpWrapper .mainNavigation .bottomButtonsWrapper {\r
-  border-bottom: 0;\r
-  border-top: 5px solid #393939;\r
-  padding: 20px 0 0;\r
-  margin: 15px auto 0;\r
-}\r
-.gbpWrapper .mainNavigation .middleButtonsWrapper {\r
-  text-align: center;\r
-}\r
-.gbpWrapper .mainNavigation .middleButtonsWrapper .buttonWrapper {\r
-  margin-top: 25px;\r
-}\r
-.gbpWrapper .mainNavigation .middleButtonsWrapper .iconWrapper {\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-  padding-top: 10px;\r
-}\r
-.gbpWrapper .mainNavigation .middleBox {\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-  width: 500px;\r
-  height: 150px;\r
-  border-left: 5px solid #393939;\r
-  border-right: 5px solid #393939;\r
-}\r
-.gbpWrapper .mainNavigation .middleBox .infinityIcon {\r
-  background: transparent url('../../src/app/gbp/images/infinity-loop.tpl.html') no-repeat center center;\r
-  width: 128px;\r
-  height: 128px;\r
-  margin: 11px auto 0;\r
-  cursor: pointer;\r
-}\r
-.gbpWrapper .mainNavigation .buttonWrapper {\r
-  text-align: center;\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-}\r
-.gbpWrapper .mainNavigation .buttonWrapper .btn-primary {\r
-  font-size: 2em;\r
-  padding: 25px 0;\r
-  width: 350px;\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-}\r
-.gbpWrapper .mainNavigation .buttonWrapper .icon-large:before {\r
-  font-size: 5em;\r
-}\r
-.gbpWrapper aside.col-md-3 {\r
-  min-height: 800px;\r
-}\r
-.gbpWrapper aside.col-md-3 .inWrapper {\r
-  height: 100%;\r
-}\r
-.gbpWrapper .panelWrapper {\r
-  padding: 20px 0 50px;\r
-  height: calc(100% - 109px);\r
-}\r
-.gbpWrapper .panelWrapper.no-padd-top {\r
-  padding-top: 0px;\r
-}\r
-.gbpWrapper .panelWrapper button.btn {\r
-  margin-bottom: 5px;\r
-}\r
-.gbpWrapper .panelWrapper button.btn-list {\r
-  margin-top: 25px;\r
-}\r
-.gbpWrapper .panelWrapper button.btn-default:hover {\r
-  background-color: #e6e6e6 !important;\r
-}\r
-.gbpWrapper .panelWrapper button.btn-default:focus {\r
-  background-color: #fff;\r
-}\r
-.gbpWrapper .panelWrapper button.activated,\r
-.gbpWrapper .panelWrapper button.activated:focus {\r
-  background-color: #e6e6e6 !important;\r
-}\r
-.gbpWrapper .breadcrumbs {\r
-  padding: 10px 0px;\r
-  font-weight: bold;\r
-  border: 0;\r
-  line-height: initial;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend {\r
-  margin-bottom: 25px;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend span,\r
-.gbpWrapper section.sigmaWrapper div.legend .text {\r
-  color: #fff;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend ul {\r
-  padding: 0;\r
-  margin: 0;\r
-  list-style: none;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend li {\r
-  margin-bottom: 5px;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend li .textHidden {\r
-  display: none;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend li .text {\r
-  margin-left: 10px;\r
-  line-height: 18px;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend li .showChckbx {\r
-  position: relative;\r
-  top: 2px;\r
-  left: 5px;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend li .itemWrapper:hover .text {\r
-  display: block !important;\r
-}\r
-.gbpWrapper section.sigmaWrapper div.legend div.color {\r
-  /*margin-right: 15px;*/\r
-  width: 18px;\r
-  height: 18px;\r
-  -webkit-border-radius: 9px;\r
-  border-radius: 9px;\r
-  cursor: pointer;\r
-}\r
-.gbpWrapper #graph-container {\r
-  padding: 0;\r
-  height: 800px;\r
-}\r
-.gbpWrapper .selectWrapper {\r
-  padding-left: 0;\r
-}\r
-.gbpWrapper .selectWrapper.col-md-12 {\r
-  padding: 0;\r
-  margin-bottom: 5px;\r
-}\r
-.gbpWrapper .inputWrapper.leftInput {\r
-  padding-left: 0;\r
-}\r
-.gbpWrapper .inputWrapper.rightInput {\r
-  padding-right: 0;\r
-}\r
-.gbpWrapper .separator {\r
-  padding-bottom: 10px;\r
-  margin-top: 15px;\r
-  height: 1px;\r
-  padding-left: 0px;\r
-  padding-right: 15px;\r
-}\r
-.gbpWrapper .inner-separator {\r
-  border-bottom: 1px solid #858585;\r
-  width: 100%;\r
-  float: left;\r
-}\r
-.gbpWrapper .btn-group {\r
-  padding: 0;\r
-}\r
-.gbpWrapper .formWrapper {\r
-  margin: 20px 0;\r
-}\r
-.gbpWrapper .icon-remove.align-right {\r
-  float: right;\r
-}\r
-.gbpWrapper .icon-remove.align-right.padding {\r
-  margin: 5px 5px 0 0;\r
-}\r
-.gbpWrapper .icon-exclamation-sign.red {\r
-  color: red;\r
-}\r
-.gbpWrapper .sigmaWrapper {\r
-  position: relative;\r
-}\r
-.gbpWrapper .sigmaWrapper .sigmaModalWrapper {\r
-  position: absolute;\r
-  top: 30px;\r
-  left: 45px;\r
-  z-index: 1;\r
-}\r
-.gbpWrapper .sigmaWrapper .sigmaModalWrapper .icon-remove {\r
-  position: absolute;\r
-  top: 5px;\r
-  right: 5px;\r
-}\r
-.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper {\r
-  position: relative;\r
-  background: #f5f5f5;\r
-  -webkit-border-radius: 5px;\r
-  -moz-border-radius: 5px;\r
-  -ms-border-radius: 5px;\r
-  -o-border-radius: 5px;\r
-  border-radius: 5px;\r
-  min-width: 400px;\r
-  min-height: 100px;\r
-  margin-top: 20px;\r
-  padding: 20px;\r
-}\r
-.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .dataWrapper {\r
-  overflow-y: scroll;\r
-  max-height: 350px;\r
-}\r
-.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .rowWrapper {\r
-  padding: 10px;\r
-  margin-bottom: 10px;\r
-  -webkit-border-radius: 5px;\r
-  -moz-border-radius: 5px;\r
-  -ms-border-radius: 5px;\r
-  -o-border-radius: 5px;\r
-  border-radius: 5px;\r
-  border: 1px solid #d5d5d5;\r
-}\r
-.modal-dialog {\r
-  z-index: 100;\r
-  height: 700px;\r
-  width: 700px;\r
-  background-color: white;\r
-  position: fixed;\r
-  opacity: 1;\r
-  top: 50%;\r
-  left: 50%;\r
-  margin: -350px 0 0 -400px;\r
-}\r
-.modal-dialog .modal-header {\r
-  height: 70px;\r
-  padding: 10px 15px;\r
-}\r
-.modal-dialog .modal-navigation {\r
-  float: left;\r
-  width: 150px;\r
-  height: 630px;\r
-  border-right: 1px solid #e5e5e5;\r
-  background-color: #eeeeee;\r
-}\r
-.modal-dialog .modal-navigation ul {\r
-  -webkit-padding-start: 0;\r
-  list-style-type: none;\r
-}\r
-.modal-dialog .modal-navigation ul li.navigation-item {\r
-  height: 54px;\r
-  width: 100%;\r
-  background-color: #eeeeee;\r
-  color: #666;\r
-  font-weight: bold;\r
-  padding: 20px;\r
-}\r
-.modal-dialog .modal-navigation ul li.navigation-item.selected {\r
-  background-color: #428bca;\r
-  border-color: #357ebd;\r
-  color: #ffffff;\r
-}\r
-.modal-dialog .modal-content-container {\r
-  float: right;\r
-  width: 550px;\r
-  height: 630px;\r
-}\r
-.modal-dialog .modal-content-container .content {\r
-  overflow-y: scroll;\r
-  padding: 0 50px 0 20px;\r
-  height: 580px;\r
-}\r
-.modal-dialog .modal-content-container .bottom-navigation {\r
-  height: 50px;\r
-  bottom: 0;\r
-  float: right;\r
-  margin: 8px 30px;\r
-}\r
-.modal-canvas {\r
-  position: fixed;\r
-  top: 0;\r
-  right: 0;\r
-  bottom: 0;\r
-  left: 0;\r
-  z-index: 10;\r
-  background-color: #000;\r
-  opacity: .15;\r
-}\r
-.link-tools .tool-remove {\r
-  display: none;\r
-}\r
-.link-tools .tool-options {\r
-  display: none;\r
-}\r
-.connection-wrap,\r
-.marker-arrowheads {\r
-  display: none;\r
-}/*-------------------YangUI import START-------------------*/\r
-.gbpWrapper .customContainer {\r
-  border-left: 1px solid #7a7a7a;\r
-  margin: 35px 5px 5px 15px;\r
-  padding: 5px;\r
-  /*z-index: 10;*/\r
-  width: auto;\r
-  position: relative;\r
-}\r
-.gbpWrapper .customContainer.withoutBorder {\r
-  border-left: 0;\r
-  padding-bottom: 0;\r
-}\r
-.gbpWrapper .customContainer.withoutBorder .treeBullet.containerBullet {\r
-  left: -25px;\r
-  top: -25px;\r
-}\r
-.gbpWrapper .topContainerPart {\r
-  margin-left: -19px;\r
-  margin-top: -28px;\r
-  margin-bottom: 10px;\r
-}\r
-.gbpWrapper .treeBullet {\r
-  font-size: 25px;\r
-  color: #7a7a7a;\r
-  position: absolute;\r
-  left: -15px;\r
-  top: 0;\r
-}\r
-.gbpWrapper .treeBullet.containerBullet {\r
-  top: -25px;\r
-  left: -25px;\r
-}\r
-.gbpWrapper .btn-name {\r
-  -webkit-border-radius: 5px;\r
-  border-radius: 5px;\r
-  background: transparent;\r
-  font-weight: bold;\r
-  color: #393939;\r
-  border: 2px solid #393939;\r
-  cursor: auto;\r
-}\r
-.gbpWrapper button.yangButton,\r
-.gbpWrapper div.yangButton {\r
-  cursor: pointer;\r
-  position: relative;\r
-  width: 24px;\r
-  height: 24px;\r
-  border: 0;\r
-  margin: 2px;\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-}\r
-.gbpWrapper button.yangButton.iconArrowDown,\r
-.gbpWrapper div.yangButton.iconArrowDown {\r
-  background: transparent url('images/yang-ui-icons/icon-arrow-down.tpl.html') no-repeat center top;\r
-}\r
-.gbpWrapper button.yangButton.iconArrowRight,\r
-.gbpWrapper div.yangButton.iconArrowRight {\r
-  background: transparent url('images/yang-ui-icons/icon-arrow-right.tpl.html') no-repeat center top;\r
-}\r
-.gbpWrapper button.yangButton.iconNext,\r
-.gbpWrapper div.yangButton.iconNext {\r
-  background: transparent url('images/yang-ui-icons/icon-next.tpl.html') no-repeat center top;\r
-}\r
-.gbpWrapper button.yangButton.iconPrev,\r
-.gbpWrapper div.yangButton.iconPrev {\r
-  background: transparent url('images/yang-ui-icons/icon-prev.tpl.html') no-repeat center top;\r
-}\r
-.gbpWrapper button.yangButton:hover,\r
-.gbpWrapper div.yangButton:hover {\r
-  background-position: center -24px;\r
-}\r
-.gbpWrapper button.yangButton.disabled,\r
-.gbpWrapper div.yangButton.disabled {\r
-  -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity= 40 )' !important;\r
-  filter: alpha(opacity= 40 ) !important;\r
-  -moz-opacity: 0.4 !important;\r
-  -khtml-opacity: 0.4 !important;\r
-  opacity: 0.4 !important;\r
-}\r
-.gbpWrapper button.yangButton.disabled:hover,\r
-.gbpWrapper div.yangButton.disabled:hover {\r
-  background-position: center top;\r
-}\r
-.gbpWrapper .btn-slim {\r
-  padding-top: 2px;\r
-  padding-bottom: 2px;\r
-}\r
-.gbpWrapper .inlineBlock {\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-}\r
-.gbpWrapper .leaf {\r
-  margin: 5px;\r
-  padding-left: 5px;\r
-  position: relative;\r
-}\r
-.gbpWrapper .leaf-label {\r
-  margin-right: 10px;\r
-  font-weight: bold;\r
-  display: -moz-inline-stack;\r
-  display: inline-block;\r
-  vertical-align: top;\r
-  zoom: 1;\r
-  *display: inline;\r
-  /*width: 170px;*/\r
-  padding-top: 6px;\r
-}\r
-.gbpWrapper .leaf-label button.iconQuestion {\r
-  margin-top: -2px;\r
-}\r
-.gbpWrapper .leaf-label i.icon-key {\r
-  font-size: 1.3em;\r
-  padding-left: 5px;\r
-}\r
-.gbpWrapper .clear {\r
-  clear: both;\r
-}\r
-.gbpWrapper .borderArrow {\r
-  color: #393939;\r
-  position: absolute;\r
-  bottom: -6px;\r
-  left: -6px;\r
-  font-size: 1.3em;\r
-}\r
-.gbpWrapper .tooltip-inner {\r
-  color: #fff;\r
-  white-space: pre-wrap;\r
-  /* CSS3 */\r
-  white-space: -moz-pre-wrap;\r
-  /* Firefox */\r
-  white-space: -pre-wrap;\r
-  /* Opera <7 */\r
-  white-space: -o-pre-wrap;\r
-  /* Opera 7 */\r
-  word-wrap: break-word;\r
-  /* IE */\r
-}\r
-/*-------------------YangUI import END-------------------*/\r
-/*\r
--------------------JointJS Graph START-------------------\r
-.html-element {\r
-  position: absolute;\r
-  background: #3498DB;\r
-  pointer-events: none;\r
-  -webkit-user-select: none;\r
-  border-radius: 4px;\r
-  border: 2px solid #2980B9;\r
-  box-shadow: inset 0 0 5px black, 2px 2px 1px gray;\r
-  padding: 5px;\r
-  box-sizing: border-box;\r
-  z-index: 2;\r
-  pointer-events: auto;\r
-  bottom: 0;\r
-  left: 0;\r
-  right: 0;\r
-  color: #333;\r
-  height: 16px;\r
-  margin-top: 107px;\r
-  margin-left: 16px;\r
-  width: 50px !important;\r
-  height: 20px !important;\r
-}\r
--------------------JointJS Graph END-------------------\r
-*/\r
-/*GBP END*/\r
-\r
-.gbpWrapper .btn-like-tab {\r
-  text-decoration: none;\r
-  color: #464646;\r
-  border: 0;\r
-  line-height: 32px;\r
-  padding: 0 15px;\r
-  background: transparent !important;\r
-  border-bottom: 3px solid transparent;\r
-  margin: 0 10px;\r
-  -webkit-border-radius: 0;\r
-  -moz-border-radius: 0;\r
-  -ms-border-radius: 0;\r
-  -o-border-radius: 0;\r
-  border-radius: 0;\r
-  -webkit-transition: 150ms;\r
-  transition: 150ms;\r
-  -webkit-transition: all 150ms linear;\r
-  -moz-transition: all 150ms linear;\r
-  -ms-transition: all 150ms linear;\r
-  -o-transition: all 150ms linear;\r
-  transition: all 150ms linear;\r
-}\r
-.gbpWrapper .btn-like-tab.btn-selected,\r
-.gbpWrapper .btn-like-tab:hover {\r
-  border-bottom: 3px solid #1baafd;\r
-  background: transparent !important;\r
-}\r
-\r
-.gbpWrapper h1, .gbpWrapper h2, .gbpWrapper h3 {\r
-  color: #393939;\r
-}\r
-\r
-#page_logo {\r
-  display:none;\r
-}\r
-\r
-\r
+.pl0 {
+  padding-left: 0 !important;
+}
+.pr0 {
+  padding-right: 0 !important;
+}
+.mt10 {
+  margin-top: 10px;
+}
+.mt20 {
+  margin-top: 20px;
+}
+.mt30 {
+  margin-top: 30px;
+}
+.mt40 {
+  margin-top: 40px;
+}
+.mb50 {
+  margin-bottom: 50px;
+}
+.mb0 {
+  margin-bottom: 0px !important;
+}
+.ml10 {
+  margin-left: 10px !important;
+}
+.ml20 {
+  margin-left: 20px !important;
+}
+.ml30 {
+  margin-left: 30px !important;
+}
+.maxHeight500 {
+  max-height: 500px;
+  overflow-y: scroll;
+}
+.gbpGlobalWrapper {
+  background: #f5f5f5;
+  margin-bottom: 0!important;
+  min-height: 100%;
+  padding-bottom: 60px;
+}
+.gbpGlobalWrapper span,
+.gbpGlobalWrapper label {
+  color: #393939;
+}
+.gbpGlobalWrapper h2 {
+  color: #666;
+}
+.gbpGlobalWrapper .form-control,
+.gbpGlobalWrapper .main input[type="text"] {
+  background: #fff;
+  color: #858585;
+}
+.gbpGlobalWrapper .form-control[disabled],
+.gbpGlobalWrapper .main input[type="text"][disabled] {
+  background: #eeeeee;
+}
+.gbpGlobalWrapper .form-control.narrow-input-left {
+  width: 45%;
+  float: left;
+}
+.gbpGlobalWrapper .form-control.narrow-input-right {
+  width: 45%;
+  float: right;
+}
+.gbpGlobalWrapper .row-param {
+  margin-bottom: 15px;
+  float: left;
+}
+.gbpGlobalWrapper .param-label {
+  width: 100%;
+  float: left;
+}
+.gbpGlobalWrapper .ep-filter {
+  margin-bottom: 20px;
+}
+.gbpGlobalWrapper .ep-filter DIV {
+  width: 48%;
+}
+.gbpGlobalWrapper .float-left {
+  float: left;
+}
+.gbpGlobalWrapper .float-right {
+  float: right;
+}
+.gbpGlobalWrapper .full-width {
+  width: 100%;
+}
+.gbpGlobalWrapper .full-width .btn {
+  width: 50px;
+}
+.gbpGlobalWrapper .full-width label {
+  margin-top: 10px;
+}
+.gbpWrapper .btn-primary {
+  color: #ffffff;
+  background-color: #428bca;
+  border-color: #357ebd;
+  font-weight: normal;
+}
+.gbpWrapper .btn-primary:hover {
+  background-color: #1BAAFD;
+  border-color: #1BAAFD;
+}
+.gbpWrapper .btn-primary.bottom-buttons {
+  bottom: 0;
+  position: absolute;
+  margin-bottom: 0 !important;
+  background-color: #FF7300;
+  border-color: #FF7300;
+  width: 45%;
+}
+.gbpWrapper .btn-primary.bottom-buttons.back {
+  right: 0;
+  margin-right: 15px;
+}
+.gbpWrapper .btn-primary.bottom-buttons.home {
+  left: 0;
+  margin-left: 15px;
+}
+.gbpWrapper .btn-primary.bottom-buttons:hover {
+  background-color: #FF8f33;
+  border-color: #FF8f33;
+}
+.gbpWrapper .btn-primary.bottom-buttons.full-width {
+  width: calc(100% - 30px);
+  left: 0;
+  margin-left: 15px;
+}
+.gbpWrapper .btn-primary.bottom-buttons.wizard-button {
+  bottom: 40px;
+}
+.gbpWrapper .btn-primary.btn-big {
+  padding: 20px;
+  font-size: 1.5em;
+  white-space: normal;
+}
+.gbpWrapper .noPadding {
+  padding: 0!important;
+}
+.gbpWrapper .basicLabel {
+  padding: 0;
+  font-weight: normal;
+}
+.gbpWrapper .rowWrapper {
+  margin-bottom: 5px;
+}
+.gbpWrapper .inline-block {
+  display: inline-block;
+}
+.gbpWrapper #graph {
+  overflow: auto;
+  width: 100%;
+  height: 100%;
+}
+.gbpWrapper .graphWrapper {
+  position: relative;
+}
+.gbpWrapper .graphWrapper .controlPanelButtons {
+  position: absolute;
+  top: 50px;
+  right: 0px;
+}
+.gbpWrapper .graphWrapper .controlPanelButtons .line {
+  margin: 5px 0;
+}
+.gbpWrapper .graphWrapper .btn {
+  min-width: 22px;
+  line-height: 22px;
+  text-align: center;
+  padding: 0!important;
+}
+.gbpWrapper .simpleBox {
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  border: 1px solid #e5e5e5;
+  background: #fff;
+  padding: 20px;
+}
+.gbpWrapper .simpleBox h2 {
+  margin-top: 0;
+}
+.gbpWrapper .sectionTitle {
+  padding: 20px;
+}
+.gbpWrapper .sectionTitle label {
+  font-size: 25px;
+}
+.gbpWrapper .legendBox {
+  position: absolute;
+  top: 50px;
+  right: 50px;
+  z-index: 10;
+}
+.gbpWrapper .legendBox ul {
+  padding: 0;
+  list-style: none;
+}
+.gbpWrapper .legendBox ul .item {
+  padding-top: 5px;
+  margin-bottom: 10px;
+}
+.gbpWrapper .legendBox ul .line {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+  margin: 9px 5px 0 0;
+  width: 50px;
+}
+.gbpWrapper .legendBox ul .line.blue {
+  border-top: 2px solid blue;
+}
+.gbpWrapper .legendBox ul .line.green {
+  border-top: 2px solid green;
+}
+.gbpWrapper .mainNavigationWrapper {
+  padding-bottom: 50px;
+  overflow-x: scroll;
+}
+.gbpWrapper .mainNavigation {
+  padding-top: 5%;
+  min-width: 1450px;
+}
+.gbpWrapper .mainNavigation .topButtonsWrapper,
+.gbpWrapper .mainNavigation .bottomButtonsWrapper {
+  text-align: center;
+  width: 400px;
+  margin: 0 auto 15px;
+  padding: 0 0 20px;
+  border-bottom: 5px solid #393939;
+}
+.gbpWrapper .mainNavigation .bottomButtonsWrapper {
+  border-bottom: 0;
+  border-top: 5px solid #393939;
+  padding: 20px 0 0;
+  margin: 15px auto 0;
+}
+.gbpWrapper .mainNavigation .middleButtonsWrapper {
+  text-align: center;
+}
+.gbpWrapper .mainNavigation .middleButtonsWrapper .buttonWrapper {
+  margin-top: 25px;
+}
+.gbpWrapper .mainNavigation .middleButtonsWrapper .iconWrapper {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+  padding-top: 10px;
+}
+.gbpWrapper .mainNavigation .middleBox {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+  width: 500px;
+  height: 150px;
+  border-left: 5px solid #393939;
+  border-right: 5px solid #393939;
+}
+.gbpWrapper .mainNavigation .middleBox .infinityIcon {
+  background: transparent url('../../src/app/gbp/images/infinity-loop.tpl.html') no-repeat center center;
+  width: 128px;
+  height: 128px;
+  margin: 11px auto 0;
+  cursor: pointer;
+}
+.gbpWrapper .mainNavigation .buttonWrapper {
+  text-align: center;
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+}
+.gbpWrapper .mainNavigation .buttonWrapper .btn-primary {
+  font-size: 2em;
+  padding: 25px 0;
+  width: 350px;
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+}
+.gbpWrapper .mainNavigation .buttonWrapper .icon-large:before {
+  font-size: 5em;
+}
+.gbpWrapper aside.col-md-3 {
+  min-height: 800px;
+}
+.gbpWrapper aside.col-md-3 .inWrapper {
+  height: 100%;
+}
+.gbpWrapper .panelWrapper {
+  padding: 20px 0 50px;
+  height: calc(100% - 109px);
+}
+.gbpWrapper .panelWrapper.no-padd-top {
+  padding-top: 0px;
+}
+.gbpWrapper .panelWrapper button.btn {
+  margin-bottom: 5px;
+}
+.gbpWrapper .panelWrapper button.btn-list {
+  margin-top: 25px;
+}
+.gbpWrapper .panelWrapper button.btn-default:hover {
+  background-color: #e6e6e6 !important;
+}
+.gbpWrapper .panelWrapper button.btn-default:focus {
+  background-color: #fff;
+}
+.gbpWrapper .panelWrapper button.activated,
+.gbpWrapper .panelWrapper button.activated:focus {
+  background-color: #e6e6e6 !important;
+}
+.gbpWrapper .breadcrumbs {
+  padding: 10px 0px;
+  font-weight: bold;
+  border: 0;
+  line-height: initial;
+}
+.gbpWrapper section.sigmaWrapper div.legend {
+  margin-bottom: 25px;
+}
+.gbpWrapper section.sigmaWrapper div.legend span,
+.gbpWrapper section.sigmaWrapper div.legend .text {
+  color: #fff;
+}
+.gbpWrapper section.sigmaWrapper div.legend ul {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+.gbpWrapper section.sigmaWrapper div.legend li {
+  margin-bottom: 5px;
+}
+.gbpWrapper section.sigmaWrapper div.legend li .textHidden {
+  display: none;
+}
+.gbpWrapper section.sigmaWrapper div.legend li .text {
+  margin-left: 10px;
+  line-height: 18px;
+}
+.gbpWrapper section.sigmaWrapper div.legend li .showChckbx {
+  position: relative;
+  top: 2px;
+  left: 5px;
+}
+.gbpWrapper section.sigmaWrapper div.legend li .itemWrapper:hover .text {
+  display: block !important;
+}
+.gbpWrapper section.sigmaWrapper div.legend div.color {
+  /*margin-right: 15px;*/
+  width: 18px;
+  height: 18px;
+  -webkit-border-radius: 9px;
+  border-radius: 9px;
+  cursor: pointer;
+}
+.gbpWrapper #graph-container {
+  padding: 0;
+  height: 800px;
+}
+.gbpWrapper .selectWrapper {
+  padding-left: 0;
+}
+.gbpWrapper .selectWrapper.col-md-12 {
+  padding: 0;
+  margin-bottom: 5px;
+}
+.gbpWrapper .inputWrapper.leftInput {
+  padding-left: 0;
+}
+.gbpWrapper .inputWrapper.rightInput {
+  padding-right: 0;
+}
+.gbpWrapper .separator {
+  padding-bottom: 10px;
+  margin-top: 15px;
+  height: 1px;
+  padding-left: 0px;
+  padding-right: 15px;
+}
+.gbpWrapper .inner-separator {
+  border-bottom: 1px solid #858585;
+  width: 100%;
+  float: left;
+}
+.gbpWrapper .btn-group {
+  padding: 0;
+}
+.gbpWrapper .formWrapper {
+  margin: 20px 0;
+}
+.gbpWrapper .icon-remove.align-right {
+  float: right;
+}
+.gbpWrapper .icon-remove.align-right.padding {
+  margin: 5px 5px 0 0;
+}
+.gbpWrapper .icon-exclamation-sign.red {
+  color: red;
+}
+.gbpWrapper .sigmaWrapper {
+  position: relative;
+}
+.gbpWrapper .sigmaWrapper .sigmaModalWrapper {
+  position: absolute;
+  top: 30px;
+  left: 45px;
+  z-index: 1;
+}
+.gbpWrapper .sigmaWrapper .sigmaModalWrapper .icon-remove {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+}
+.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper {
+  position: relative;
+  background: #f5f5f5;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  min-width: 400px;
+  min-height: 100px;
+  margin-top: 20px;
+  padding: 20px;
+}
+.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .dataWrapper {
+  overflow-y: scroll;
+  max-height: 350px;
+}
+.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .rowWrapper {
+  padding: 10px;
+  margin-bottom: 10px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  border: 1px solid #d5d5d5;
+}
+.modal-dialog {
+  z-index: 100;
+  height: 700px;
+  width: 700px;
+  background-color: white;
+  position: fixed;
+  opacity: 1;
+  top: 50%;
+  left: 50%;
+  margin: -350px 0 0 -400px;
+}
+.modal-dialog .modal-header {
+  height: 70px;
+  padding: 10px 15px;
+}
+.modal-dialog .modal-navigation {
+  float: left;
+  width: 150px;
+  height: 630px;
+  border-right: 1px solid #e5e5e5;
+  background-color: #eeeeee;
+}
+.modal-dialog .modal-navigation ul {
+  -webkit-padding-start: 0;
+  list-style-type: none;
+}
+.modal-dialog .modal-navigation ul li.navigation-item {
+  height: 54px;
+  width: 100%;
+  background-color: #eeeeee;
+  color: #666;
+  font-weight: bold;
+  padding: 20px;
+}
+.modal-dialog .modal-navigation ul li.navigation-item.selected {
+  background-color: #428bca;
+  border-color: #357ebd;
+  color: #ffffff;
+}
+.modal-dialog .modal-content-container {
+  float: right;
+  width: 550px;
+  height: 630px;
+}
+.modal-dialog .modal-content-container .content {
+  overflow-y: scroll;
+  padding: 0 50px 0 20px;
+  height: 580px;
+}
+.modal-dialog .modal-content-container .bottom-navigation {
+  height: 50px;
+  bottom: 0;
+  float: right;
+  margin: 8px 30px;
+}
+.modal-canvas {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 10;
+  background-color: #000;
+  opacity: .15;
+}
+.link-tools .tool-remove {
+  display: none;
+}
+.link-tools .tool-options {
+  display: none;
+}
+.connection-wrap,
+.marker-arrowheads {
+  display: none;
+}/*-------------------YangUI import START-------------------*/
+.gbpWrapper .customContainer {
+  border-left: 1px solid #7a7a7a;
+  margin: 35px 5px 5px 15px;
+  padding: 5px;
+  /*z-index: 10;*/
+  width: auto;
+  position: relative;
+}
+.gbpWrapper .customContainer.withoutBorder {
+  border-left: 0;
+  padding-bottom: 0;
+}
+.gbpWrapper .customContainer.withoutBorder .treeBullet.containerBullet {
+  left: -25px;
+  top: -25px;
+}
+.gbpWrapper .topContainerPart {
+  margin-left: -19px;
+  margin-top: -28px;
+  margin-bottom: 10px;
+}
+.gbpWrapper .treeBullet {
+  font-size: 25px;
+  color: #7a7a7a;
+  position: absolute;
+  left: -15px;
+  top: 0;
+}
+.gbpWrapper .treeBullet.containerBullet {
+  top: -25px;
+  left: -25px;
+}
+.gbpWrapper .btn-name {
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+  background: transparent;
+  font-weight: bold;
+  color: #393939;
+  border: 2px solid #393939;
+  cursor: auto;
+}
+.gbpWrapper button.yangButton,
+.gbpWrapper div.yangButton {
+  cursor: pointer;
+  position: relative;
+  width: 24px;
+  height: 24px;
+  border: 0;
+  margin: 2px;
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+}
+.gbpWrapper button.yangButton.iconArrowDown,
+.gbpWrapper div.yangButton.iconArrowDown {
+  background: transparent url('images/yang-ui-icons/icon-arrow-down.tpl.html') no-repeat center top;
+}
+.gbpWrapper button.yangButton.iconArrowRight,
+.gbpWrapper div.yangButton.iconArrowRight {
+  background: transparent url('images/yang-ui-icons/icon-arrow-right.tpl.html') no-repeat center top;
+}
+.gbpWrapper button.yangButton.iconNext,
+.gbpWrapper div.yangButton.iconNext {
+  background: transparent url('images/yang-ui-icons/icon-next.tpl.html') no-repeat center top;
+}
+.gbpWrapper button.yangButton.iconPrev,
+.gbpWrapper div.yangButton.iconPrev {
+  background: transparent url('images/yang-ui-icons/icon-prev.tpl.html') no-repeat center top;
+}
+.gbpWrapper button.yangButton:hover,
+.gbpWrapper div.yangButton:hover {
+  background-position: center -24px;
+}
+.gbpWrapper button.yangButton.disabled,
+.gbpWrapper div.yangButton.disabled {
+  -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity= 40 )' !important;
+  filter: alpha(opacity= 40 ) !important;
+  -moz-opacity: 0.4 !important;
+  -khtml-opacity: 0.4 !important;
+  opacity: 0.4 !important;
+}
+.gbpWrapper button.yangButton.disabled:hover,
+.gbpWrapper div.yangButton.disabled:hover {
+  background-position: center top;
+}
+.gbpWrapper .btn-slim {
+  padding-top: 2px;
+  padding-bottom: 2px;
+}
+.gbpWrapper .inlineBlock {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+}
+.gbpWrapper .leaf {
+  margin: 5px;
+  padding-left: 5px;
+  position: relative;
+}
+.gbpWrapper .leaf-label {
+  margin-right: 10px;
+  font-weight: bold;
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+  /*width: 170px;*/
+  padding-top: 6px;
+}
+.gbpWrapper .leaf-label button.iconQuestion {
+  margin-top: -2px;
+}
+.gbpWrapper .leaf-label i.icon-key {
+  font-size: 1.3em;
+  padding-left: 5px;
+}
+.gbpWrapper .clear {
+  clear: both;
+}
+.gbpWrapper .borderArrow {
+  color: #393939;
+  position: absolute;
+  bottom: -6px;
+  left: -6px;
+  font-size: 1.3em;
+}
+.gbpWrapper .tooltip-inner {
+  color: #fff;
+  white-space: pre-wrap;
+  /* CSS3 */
+  white-space: -moz-pre-wrap;
+  /* Firefox */
+  white-space: -pre-wrap;
+  /* Opera <7 */
+  white-space: -o-pre-wrap;
+  /* Opera 7 */
+  word-wrap: break-word;
+  /* IE */
+}
+/*-------------------YangUI import END-------------------*/
+/*
+-------------------JointJS Graph START-------------------
+.html-element {
+  position: absolute;
+  background: #3498DB;
+  pointer-events: none;
+  -webkit-user-select: none;
+  border-radius: 4px;
+  border: 2px solid #2980B9;
+  box-shadow: inset 0 0 5px black, 2px 2px 1px gray;
+  padding: 5px;
+  box-sizing: border-box;
+  z-index: 2;
+  pointer-events: auto;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  color: #333;
+  height: 16px;
+  margin-top: 107px;
+  margin-left: 16px;
+  width: 50px !important;
+  height: 20px !important;
+}
+-------------------JointJS Graph END-------------------
+*/
+/*GBP END*/
+
+.gbpWrapper .btn-like-tab {
+  text-decoration: none;
+  color: #464646;
+  border: 0;
+  line-height: 32px;
+  padding: 0 15px;
+  background: transparent !important;
+  border-bottom: 3px solid transparent;
+  margin: 0 10px;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  -webkit-transition: 150ms;
+  transition: 150ms;
+  -webkit-transition: all 150ms linear;
+  -moz-transition: all 150ms linear;
+  -ms-transition: all 150ms linear;
+  -o-transition: all 150ms linear;
+  transition: all 150ms linear;
+}
+.gbpWrapper .btn-like-tab.btn-selected,
+.gbpWrapper .btn-like-tab:hover {
+  border-bottom: 3px solid #1baafd;
+  background: transparent !important;
+}
+
+.gbpWrapper h1, .gbpWrapper h2, .gbpWrapper h3 {
+  color: #393939;
+}
+
+#page_logo {
+  display:none;
+}
+
+
old mode 100755 (executable)
new mode 100644 (file)
similarity index 94%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.less
index 8b70417..597e5f9
-/*GBP*/\r
-.pl0{padding-left: 0!important};\r
-.pr0{padding-right: 0!important};\r
-\r
-.mt10{margin-top: 10px};\r
-.mt20{margin-top: 20px};\r
-.mt30{margin-top: 30px};\r
-.mt40{margin-top: 40px};\r
-\r
-.mb50{margin-bottom: 50px};\r
-.mb0{margin-bottom: 0px!important};\r
-\r
-.ml10{margin-left: 10px!important};\r
-.ml20{margin-left: 20px!important};\r
-.ml30{margin-left: 30px!important};\r
-\r
-.maxHeight500{\r
-  max-height: 500px;\r
-  overflow-y: scroll;\r
-}\r
-\r
-.gbpGlobalWrapper{\r
-  background: #f5f5f5;\r
-  margin-bottom: 0!important;\r
-  min-height: 100%;\r
-  padding-bottom: 60px;\r
-  \r
-  span, label {\r
-    color: #393939;\r
-  }\r
-\r
-  h2{\r
-    color: #666;\r
-  }\r
-\r
-  .form-control, .main input[type="text"]{\r
-    background: #fff;\r
-    color: #858585;\r
-\r
-    &[disabled]{\r
-      background: #eeeeee;\r
-    }\r
-  }\r
-    \r
-\r
-  .form-control{\r
-    &.narrow-input-left{\r
-      width: 45%;\r
-      float: left;\r
-    }\r
-    &.narrow-input-right{\r
-      width: 45%;\r
-      float: right;\r
-    }\r
-  }\r
-\r
-  .row-param{\r
-    margin-bottom: 15px;\r
-    float: left;\r
-  }\r
-\r
-  .param-label{\r
-    width:100%;\r
-    float: left;\r
-  }\r
-\r
-  .ep-filter{\r
-    margin-bottom: 20px;\r
-    DIV{\r
-      width: 48%;\r
-    }\r
-  }\r
-\r
-  .float-left{\r
-    float: left;\r
-  }\r
-\r
-  .float-right{\r
-    float: right;\r
-  }\r
-\r
-  .full-width{\r
-    width: 100%;\r
-\r
-    .btn{\r
-      width: 50px;\r
-    }\r
-\r
-    label{\r
-      margin-top: 10px;\r
-    }\r
-  }\r
-}\r
-\r
-.gbpWrapper{\r
-\r
-  .btn-primary{\r
-    color: #ffffff;\r
-    background-color: #428bca;\r
-    border-color: #357ebd;\r
-    font-weight: normal;\r
-\r
-    &:hover {\r
-      background-color: #1BAAFD;\r
-      border-color: #1BAAFD;\r
-    }\r
-\r
-    &.bottom-buttons {\r
-      bottom: 0;\r
-      position: absolute;\r
-      margin-bottom: 0 !important;\r
-      background-color: #FF7300;\r
-      border-color: #FF7300;\r
-      width: 45%;\r
-\r
-      &.back {\r
-        right:0;\r
-        margin-right: 15px;\r
-      }\r
-\r
-      &.home {\r
-        left:0;\r
-        margin-left: 15px;\r
-      }\r
-\r
-      &:hover {\r
-        background-color: #FF8f33;\r
-        border-color: #FF8f33;\r
-      }      \r
-\r
-      &.full-width{\r
-        width: calc(~'100% - 30px');\r
-        left: 0;\r
-        margin-left: 15px;\r
-      }\r
-\r
-      &.wizard-button{\r
-        bottom: 40px;\r
-      }\r
-    }\r
-\r
-    &.btn-big{\r
-      padding: 20px;\r
-      font-size: 1.5em;\r
-      white-space: normal;\r
-    }\r
-  }\r
-\r
-  .noPadding{\r
-    padding: 0!important;\r
-  }\r
-\r
-  .basicLabel{\r
-    padding: 0;\r
-    font-weight: normal;\r
-  }\r
-\r
-  .rowWrapper{\r
-    margin-bottom: 5px;\r
-  }\r
-\r
-  .inline-block{\r
-    display: inline-block;\r
-  }\r
-\r
-  #graph{\r
-    overflow: auto;\r
-    width: 100%;\r
-    height: 100%;\r
-  }\r
-\r
-  .graphWrapper{\r
-    position: relative;\r
-\r
-    .controlPanelButtons{\r
-      position: absolute;\r
-      top: 50px;\r
-      right: 0px;\r
-\r
-      .line{\r
-        margin: 5px 0;\r
-      }\r
-    }\r
-\r
-    .btn{\r
-        min-width: 22px;\r
-        line-height: 22px;\r
-        text-align: center;\r
-        padding: 0!important;\r
-    }\r
-  }\r
-\r
-  //SIMPLE BOX\r
-  .simpleBox{\r
-    .roundedCorners(5px);\r
-    border: 1px solid #e5e5e5;\r
-    background: #fff;\r
-    padding: 20px;\r
-\r
-    h2{\r
-      margin-top: 0;\r
-    }\r
-  }\r
-\r
-  .sectionTitle{\r
-    padding: 20px;\r
-    label{\r
-      font-size: 25px;\r
-    }\r
-  }\r
-\r
-  //LEGEND BOX\r
-  .legendBox{\r
-    position: absolute;\r
-    top: 50px;\r
-    right: 50px;\r
-    z-index: 10;\r
-    ul{\r
-      padding: 0;\r
-      list-style: none;\r
-\r
-      .item{\r
-        padding-top: 5px;\r
-        margin-bottom: 10px;\r
-      }\r
-\r
-      .line{\r
-        .inlineBlock;\r
-        margin: 9px 5px 0 0;\r
-        width: 50px;\r
-\r
-        &.blue{\r
-          border-top: 2px solid blue;\r
-        }\r
-\r
-        &.green{\r
-          border-top: 2px solid green;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  //MAIN NAVIGATION\r
-  .mainNavigationWrapper{\r
-    padding-bottom: 50px;\r
-    overflow-x: scroll;\r
-  }\r
-  .mainNavigation{\r
-    padding-top: 5%;\r
-    min-width: 1450px;\r
-    .topButtonsWrapper, .bottomButtonsWrapper{\r
-      text-align: center;\r
-      width: 400px;\r
-      margin: 0 auto 15px;\r
-      padding: 0 0 20px;\r
-      border-bottom: 5px solid #393939;\r
-    }\r
-\r
-    .bottomButtonsWrapper{\r
-      border-bottom: 0;\r
-      border-top: 5px solid #393939;\r
-      padding: 20px 0 0;\r
-      margin: 15px auto 0;\r
-    }\r
-\r
-    .middleButtonsWrapper{\r
-      text-align: center;\r
-\r
-      .buttonWrapper{\r
-        margin-top: 25px;\r
-        \r
-      }\r
-\r
-      .iconWrapper{\r
-        .inlineBlock;\r
-        padding-top: 10px;\r
-      }\r
-    }\r
-\r
-    .middleBox{\r
-      .inlineBlock;\r
-      width: 500px;\r
-      height: 150px;\r
-      border-left: 5px solid #393939;\r
-      border-right: 5px solid #393939;\r
-\r
-      .infinityIcon{\r
-        background: transparent url('../../src/app/gbp/images/infinity-loop.tpl.html') no-repeat center center;\r
-        width: 128px;\r
-        height: 128px;\r
-        margin: 11px auto 0;\r
-        cursor: pointer;\r
-      }\r
-    }\r
-\r
-    .buttonWrapper{\r
-      text-align: center;\r
-      // width: 300px;\r
-      // margin: 0 auto;\r
-      .inlineBlock;\r
-\r
-      .btn-primary{\r
-        font-size: 2em;\r
-        padding: 25px 0;\r
-        width: 350px;\r
-        .inlineBlock;\r
-      }\r
-\r
-      .icon-large{\r
-        &:before{\r
-          font-size: 5em;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  //RIGHT PANEL\r
-  aside{\r
-    &.col-md-3{\r
-      min-height: 800px;\r
-\r
-      .inWrapper{\r
-        height: 100%;\r
-      }\r
-    }\r
-  }\r
-\r
-  .panelWrapper{\r
-    padding: 20px 0 50px; \r
-    height: calc(~'100% - 109px');\r
-    &.no-padd-top{\r
-      padding-top: 0px;\r
-    }\r
-    button{\r
-      &.btn{\r
-        margin-bottom: 5px;\r
-      }\r
-      &.btn-list{\r
-        margin-top: 25px;\r
-      }\r
-      &.btn-default:hover {\r
-        background-color: #e6e6e6 !important;\r
-      }\r
-      &.btn-default:focus {\r
-        background-color: #fff;\r
-      }\r
-      &.activated, &.activated:focus {\r
-        background-color: #e6e6e6 !important;\r
-      }\r
-    }\r
-  }\r
-\r
-  .breadcrumbs{\r
-    padding: 10px 0px; \r
-    font-weight: bold;\r
-    border: 0;\r
-    line-height: initial;\r
-  }\r
-\r
-  section.sigmaWrapper {\r
-    div.legend{\r
-      margin-bottom: 25px;\r
-      \r
-      span, .text{\r
-        color: #fff;\r
-      }\r
-\r
-      ul{\r
-        padding: 0;\r
-        margin: 0;\r
-        list-style: none;\r
-      }\r
-      li{\r
-        margin-bottom: 5px;\r
-        .textHidden{\r
-          display: none;\r
-        }\r
-        .text{\r
-          margin-left: 10px;\r
-          line-height: 18px;\r
-        }\r
-        .showChckbx{\r
-          position: relative;\r
-          top: 2px;\r
-          left: 5px;\r
-          }\r
-        .itemWrapper{\r
-          &:hover{\r
-            .text{\r
-              display: block !important;\r
-            }\r
-          }\r
-        }\r
-        \r
-      }\r
-      div.color{\r
-        /*margin-right: 15px;*/\r
-        width: 18px;\r
-        height: 18px;\r
-        -webkit-border-radius: 9px;\r
-        border-radius: 9px;\r
-        cursor: pointer;\r
-      }\r
-    }\r
-  }\r
-\r
-  #graph-container{\r
-    // background: transparent;\r
-    padding: 0;\r
-    height: 800px;\r
-  }\r
-\r
-  .selectWrapper{\r
-    padding-left: 0;\r
-    &.col-md-12{\r
-      padding: 0;\r
-      margin-bottom: 5px;\r
-    }\r
-  }\r
-\r
-  .inputWrapper{\r
-    &.leftInput{\r
-      padding-left: 0;\r
-    }\r
-\r
-    &.rightInput{\r
-      padding-right: 0;\r
-    }\r
-  }\r
-\r
-  .separator{\r
-    padding-bottom: 10px;\r
-    margin-top: 15px;\r
-    height: 1px;\r
-    padding-left: 0px;\r
-    padding-right: 15px;\r
-  }\r
-\r
-  .inner-separator{\r
-    border-bottom: 1px solid #858585;\r
-    width: 100%;\r
-    float: left;\r
-  }\r
-\r
-  .btn-group{\r
-    padding: 0;\r
-  }\r
-\r
-  .formWrapper{\r
-    margin: 20px 0;\r
-  }\r
-\r
-  .icon-remove {\r
-    &.align-right {\r
-      float: right;\r
-\r
-      &.padding {\r
-        margin: 5px 5px 0 0;\r
-      }\r
-    }\r
-  }\r
-\r
-  .icon-exclamation-sign{\r
-    &.red {\r
-      color: red;\r
-    }\r
-  }\r
-\r
-  .sigmaWrapper{\r
-    position: relative;\r
-\r
-    .sigmaModalWrapper{\r
-      position: absolute;\r
-      top: 30px;\r
-      left: 45px;\r
-      z-index: 1;\r
-\r
-      .icon-remove{\r
-        position: absolute;\r
-        top: 5px;\r
-        right: 5px;\r
-      }\r
-\r
-      .tableWrapper{\r
-        position: relative;\r
-        background: #f5f5f5;\r
-        .roundedCorners(5px);\r
-        min-width: 400px;\r
-        min-height: 100px;\r
-        margin-top: 20px;\r
-        padding: 20px;\r
-\r
-        .dataWrapper{\r
-          overflow-y: scroll;\r
-          max-height: 350px;\r
-        }\r
-\r
-        .rowWrapper{\r
-          padding: 10px;\r
-          margin-bottom: 10px;\r
-          .roundedCorners(5px);\r
-          border: 1px solid #d5d5d5;\r
-        }\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-.modal-dialog {\r
-  z-index: 100;\r
-  height: 700px;\r
-  width: 700px;\r
-  background-color: white;\r
-  position: fixed;\r
-  opacity: 1;\r
-  top:50%;\r
-  left:50%;\r
-  margin:-350px 0 0 -400px;\r
-\r
-  .modal-header {\r
-    height: 70px;\r
-    padding: 10px 15px;\r
-  }\r
-\r
-  .modal-navigation {\r
-    float:left;\r
-    width: 150px;\r
-    height: 630px;\r
-    border-right: 1px solid #e5e5e5;\r
-    background-color: #eeeeee;\r
-\r
-    ul {\r
-      -webkit-padding-start: 0;\r
-      list-style-type: none;\r
-\r
-      li.navigation-item {\r
-         height: 54px;\r
-         width: 100%;\r
-         background-color: #eeeeee;\r
-         color: #666;\r
-         font-weight: bold;\r
-         padding: 20px;\r
-\r
-         &.selected {\r
-          background-color: #428bca;\r
-          border-color: #357ebd;\r
-          color: #ffffff;\r
-         }\r
-      }\r
-    }\r
-  }\r
-\r
-  .modal-content-container {\r
-    float: right;\r
-    width: 550px;\r
-    height: 630px;\r
-\r
-    .content {\r
-      overflow-y: scroll;\r
-      padding: 0 50px 0 20px;\r
-      height: 580px;\r
-    }\r
-\r
-    .bottom-navigation {\r
-      height: 50px;\r
-      bottom: 0;\r
-      float: right;\r
-      margin: 8px 30px\r
-    } \r
-  }\r
-\r
-\r
-\r
-  \r
-}\r
-\r
-.modal-canvas {\r
-  position: fixed;\r
-  top: 0;\r
-  right: 0;\r
-  bottom: 0;\r
-  left: 0;\r
-  z-index: 10;\r
-  background-color: #000;\r
-  opacity: .15;\r
-}\r
-\r
-.link-tools .tool-remove { display: none }\r
-.link-tools .tool-options { display: none }\r
-.connection-wrap, .marker-arrowheads { display: none }\r
-\r
-/*-------------------YangUI import START-------------------*/\r
-\r
-@iconsRootPath : 'images/yang-ui-icons/';\r
-.gbpWrapper{\r
-  .customContainer{\r
-    border-left: 1px solid #7a7a7a;\r
-    margin: 35px 5px 5px 15px;\r
-    padding: 5px;\r
-    /*z-index: 10;*/\r
-    width:auto;\r
-    position: relative;\r
-    &.withoutBorder{\r
-      border-left: 0;\r
-      padding-bottom: 0;\r
-      .treeBullet.containerBullet{\r
-        left: -25px;\r
-        top: -25px;\r
-      }\r
-    }\r
-  }\r
-\r
-  .topContainerPart{\r
-    margin-left: -19px;\r
-    margin-top: -28px;\r
-    margin-bottom: 10px;\r
-  }\r
-\r
-  .treeBullet{\r
-    font-size: 25px;\r
-    color: #7a7a7a;\r
-    position: absolute;\r
-    left: -15px;\r
-    top: 0;\r
-    &.containerBullet{\r
-      top: -25px; \r
-      left: -25px;\r
-    }\r
-  }\r
-\r
-  .btn-name{\r
-    -webkit-border-radius: 5px;\r
-    border-radius: 5px;\r
-    background: transparent;\r
-    font-weight: bold;\r
-    color: @text-color;\r
-    border: 2px solid @text-color;\r
-    cursor: auto;\r
-  }\r
-\r
-  button, div{\r
-    &.yangButton{\r
-      cursor: pointer;\r
-      position: relative;\r
-      width: 24px;\r
-      height: 24px;\r
-      border: 0;\r
-      margin: 2px;\r
-      .inlineBlock;\r
-      &.iconArrowDown{\r
-        background: transparent url('@{iconsRootPath}icon-arrow-down.png') no-repeat center top;\r
-      }\r
-      &.iconArrowRight{\r
-        background: transparent url('@{iconsRootPath}icon-arrow-right.png') no-repeat center top;\r
-      }\r
-      &.iconNext{\r
-        background: transparent url('@{iconsRootPath}icon-next.png') no-repeat center top;\r
-      }\r
-      &.iconPrev{\r
-        background: transparent url('@{iconsRootPath}icon-prev.png') no-repeat center top;\r
-      }\r
-      &:hover{\r
-        background-position: center -24px;\r
-      }\r
-      &.disabled{\r
-        .opacityDeph(0.4)!important;\r
-        &:hover{\r
-          background-position: center top;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  .btn-slim {\r
-      padding-top: 2px;\r
-      padding-bottom: 2px;\r
-  }\r
-\r
-  .inlineBlock {\r
-      display: -moz-inline-stack;\r
-      display: inline-block;\r
-      vertical-align: top;\r
-      zoom: 1;\r
-      *display: inline;\r
-  }\r
-\r
-  .leaf {\r
-      margin: 5px;\r
-      padding-left: 5px;\r
-      position: relative;\r
-  }\r
-\r
-  .leaf-label {\r
-      margin-right: 10px;\r
-      font-weight: bold;\r
-      .inlineBlock;\r
-      /*width: 170px;*/\r
-      padding-top: 6px;\r
-      button.iconQuestion{\r
-        margin-top: -2px;\r
-      }\r
-\r
-      i.icon-key {\r
-        font-size: 1.3em;\r
-        padding-left:  5px;\r
-      }\r
-  }\r
-\r
-  .clear{\r
-      clear: both;\r
-  }\r
-\r
-  .borderArrow{\r
-    color: @text-color;\r
-    position: absolute;\r
-    bottom: -6px;\r
-    left: -6px;\r
-    font-size: 1.3em;\r
-  }\r
-\r
-  .tooltip-inner{\r
-    color: #fff;\r
-    white-space: pre-wrap;      /* CSS3 */   \r
-    white-space: -moz-pre-wrap; /* Firefox */    \r
-    white-space: -pre-wrap;     /* Opera <7 */   \r
-    white-space: -o-pre-wrap;   /* Opera 7 */    \r
-    word-wrap: break-word;      /* IE */\r
-  }\r
-}\r
-/*-------------------YangUI import END-------------------*/\r
-\r
-/*\r
--------------------JointJS Graph START-------------------\r
-.html-element {\r
-  position: absolute;\r
-  background: #3498DB;\r
-  pointer-events: none;\r
-  -webkit-user-select: none;\r
-  border-radius: 4px;\r
-  border: 2px solid #2980B9;\r
-  box-shadow: inset 0 0 5px black, 2px 2px 1px gray;\r
-  padding: 5px;\r
-  box-sizing: border-box;\r
-  z-index: 2;\r
-  pointer-events: auto;\r
-  bottom: 0;\r
-  left: 0;\r
-  right: 0;\r
-  color: #333;\r
-  height: 16px;\r
-  margin-top: 107px;\r
-  margin-left: 16px;\r
-  width: 50px !important;\r
-  height: 20px !important;\r
-}\r
--------------------JointJS Graph END-------------------\r
-*/\r
-\r
+/*GBP*/
+.pl0{padding-left: 0!important};
+.pr0{padding-right: 0!important};
+
+.mt10{margin-top: 10px};
+.mt20{margin-top: 20px};
+.mt30{margin-top: 30px};
+.mt40{margin-top: 40px};
+
+.mb50{margin-bottom: 50px};
+.mb0{margin-bottom: 0px!important};
+
+.ml10{margin-left: 10px!important};
+.ml20{margin-left: 20px!important};
+.ml30{margin-left: 30px!important};
+
+.maxHeight500{
+  max-height: 500px;
+  overflow-y: scroll;
+}
+
+.gbpGlobalWrapper{
+  background: #f5f5f5;
+  margin-bottom: 0!important;
+  min-height: 100%;
+  padding-bottom: 60px;
+  
+  span, label {
+    color: #393939;
+  }
+
+  h2{
+    color: #666;
+  }
+
+  .form-control, .main input[type="text"]{
+    background: #fff;
+    color: #858585;
+
+    &[disabled]{
+      background: #eeeeee;
+    }
+  }
+    
+
+  .form-control{
+    &.narrow-input-left{
+      width: 45%;
+      float: left;
+    }
+    &.narrow-input-right{
+      width: 45%;
+      float: right;
+    }
+  }
+
+  .row-param{
+    margin-bottom: 15px;
+    float: left;
+  }
+
+  .param-label{
+    width:100%;
+    float: left;
+  }
+
+  .ep-filter{
+    margin-bottom: 20px;
+    DIV{
+      width: 48%;
+    }
+  }
+
+  .float-left{
+    float: left;
+  }
+
+  .float-right{
+    float: right;
+  }
+
+  .full-width{
+    width: 100%;
+
+    .btn{
+      width: 50px;
+    }
+
+    label{
+      margin-top: 10px;
+    }
+  }
+}
+
+.gbpWrapper{
+
+  .btn-primary{
+    color: #ffffff;
+    background-color: #428bca;
+    border-color: #357ebd;
+    font-weight: normal;
+
+    &:hover {
+      background-color: #1BAAFD;
+      border-color: #1BAAFD;
+    }
+
+    &.bottom-buttons {
+      bottom: 0;
+      position: absolute;
+      margin-bottom: 0 !important;
+      background-color: #FF7300;
+      border-color: #FF7300;
+      width: 45%;
+
+      &.back {
+        right:0;
+        margin-right: 15px;
+      }
+
+      &.home {
+        left:0;
+        margin-left: 15px;
+      }
+
+      &:hover {
+        background-color: #FF8f33;
+        border-color: #FF8f33;
+      }      
+
+      &.full-width{
+        width: calc(~'100% - 30px');
+        left: 0;
+        margin-left: 15px;
+      }
+
+      &.wizard-button{
+        bottom: 40px;
+      }
+    }
+
+    &.btn-big{
+      padding: 20px;
+      font-size: 1.5em;
+      white-space: normal;
+    }
+  }
+
+  .noPadding{
+    padding: 0!important;
+  }
+
+  .basicLabel{
+    padding: 0;
+    font-weight: normal;
+  }
+
+  .rowWrapper{
+    margin-bottom: 5px;
+  }
+
+  .inline-block{
+    display: inline-block;
+  }
+
+  #graph{
+    overflow: auto;
+    width: 100%;
+    height: 100%;
+  }
+
+  .graphWrapper{
+    position: relative;
+
+    .controlPanelButtons{
+      position: absolute;
+      top: 50px;
+      right: 0px;
+
+      .line{
+        margin: 5px 0;
+      }
+    }
+
+    .btn{
+        min-width: 22px;
+        line-height: 22px;
+        text-align: center;
+        padding: 0!important;
+    }
+  }
+
+  //SIMPLE BOX
+  .simpleBox{
+    .roundedCorners(5px);
+    border: 1px solid #e5e5e5;
+    background: #fff;
+    padding: 20px;
+
+    h2{
+      margin-top: 0;
+    }
+  }
+
+  .sectionTitle{
+    padding: 20px;
+    label{
+      font-size: 25px;
+    }
+  }
+
+  //LEGEND BOX
+  .legendBox{
+    position: absolute;
+    top: 50px;
+    right: 50px;
+    z-index: 10;
+    ul{
+      padding: 0;
+      list-style: none;
+
+      .item{
+        padding-top: 5px;
+        margin-bottom: 10px;
+      }
+
+      .line{
+        .inlineBlock;
+        margin: 9px 5px 0 0;
+        width: 50px;
+
+        &.blue{
+          border-top: 2px solid blue;
+        }
+
+        &.green{
+          border-top: 2px solid green;
+        }
+      }
+    }
+  }
+
+  //MAIN NAVIGATION
+  .mainNavigationWrapper{
+    padding-bottom: 50px;
+    overflow-x: scroll;
+  }
+  .mainNavigation{
+    padding-top: 5%;
+    min-width: 1450px;
+    .topButtonsWrapper, .bottomButtonsWrapper{
+      text-align: center;
+      width: 400px;
+      margin: 0 auto 15px;
+      padding: 0 0 20px;
+      border-bottom: 5px solid #393939;
+    }
+
+    .bottomButtonsWrapper{
+      border-bottom: 0;
+      border-top: 5px solid #393939;
+      padding: 20px 0 0;
+      margin: 15px auto 0;
+    }
+
+    .middleButtonsWrapper{
+      text-align: center;
+
+      .buttonWrapper{
+        margin-top: 25px;
+        
+      }
+
+      .iconWrapper{
+        .inlineBlock;
+        padding-top: 10px;
+      }
+    }
+
+    .middleBox{
+      .inlineBlock;
+      width: 500px;
+      height: 150px;
+      border-left: 5px solid #393939;
+      border-right: 5px solid #393939;
+
+      .infinityIcon{
+        background: transparent url('../../src/app/gbp/images/infinity-loop.tpl.html') no-repeat center center;
+        width: 128px;
+        height: 128px;
+        margin: 11px auto 0;
+        cursor: pointer;
+      }
+    }
+
+    .buttonWrapper{
+      text-align: center;
+      // width: 300px;
+      // margin: 0 auto;
+      .inlineBlock;
+
+      .btn-primary{
+        font-size: 2em;
+        padding: 25px 0;
+        width: 350px;
+        .inlineBlock;
+      }
+
+      .icon-large{
+        &:before{
+          font-size: 5em;
+        }
+      }
+    }
+  }
+
+  //RIGHT PANEL
+  aside{
+    &.col-md-3{
+      min-height: 800px;
+
+      .inWrapper{
+        height: 100%;
+      }
+    }
+  }
+
+  .panelWrapper{
+    padding: 20px 0 50px; 
+    height: calc(~'100% - 109px');
+    &.no-padd-top{
+      padding-top: 0px;
+    }
+    button{
+      &.btn{
+        margin-bottom: 5px;
+      }
+      &.btn-list{
+        margin-top: 25px;
+      }
+      &.btn-default:hover {
+        background-color: #e6e6e6 !important;
+      }
+      &.btn-default:focus {
+        background-color: #fff;
+      }
+      &.activated, &.activated:focus {
+        background-color: #e6e6e6 !important;
+      }
+    }
+  }
+
+  .breadcrumbs{
+    padding: 10px 0px; 
+    font-weight: bold;
+    border: 0;
+    line-height: initial;
+  }
+
+  section.sigmaWrapper {
+    div.legend{
+      margin-bottom: 25px;
+      
+      span, .text{
+        color: #fff;
+      }
+
+      ul{
+        padding: 0;
+        margin: 0;
+        list-style: none;
+      }
+      li{
+        margin-bottom: 5px;
+        .textHidden{
+          display: none;
+        }
+        .text{
+          margin-left: 10px;
+          line-height: 18px;
+        }
+        .showChckbx{
+          position: relative;
+          top: 2px;
+          left: 5px;
+          }
+        .itemWrapper{
+          &:hover{
+            .text{
+              display: block !important;
+            }
+          }
+        }
+        
+      }
+      div.color{
+        /*margin-right: 15px;*/
+        width: 18px;
+        height: 18px;
+        -webkit-border-radius: 9px;
+        border-radius: 9px;
+        cursor: pointer;
+      }
+    }
+  }
+
+  #graph-container{
+    // background: transparent;
+    padding: 0;
+    height: 800px;
+  }
+
+  .selectWrapper{
+    padding-left: 0;
+    &.col-md-12{
+      padding: 0;
+      margin-bottom: 5px;
+    }
+  }
+
+  .inputWrapper{
+    &.leftInput{
+      padding-left: 0;
+    }
+
+    &.rightInput{
+      padding-right: 0;
+    }
+  }
+
+  .separator{
+    padding-bottom: 10px;
+    margin-top: 15px;
+    height: 1px;
+    padding-left: 0px;
+    padding-right: 15px;
+  }
+
+  .inner-separator{
+    border-bottom: 1px solid #858585;
+    width: 100%;
+    float: left;
+  }
+
+  .btn-group{
+    padding: 0;
+  }
+
+  .formWrapper{
+    margin: 20px 0;
+  }
+
+  .icon-remove {
+    &.align-right {
+      float: right;
+
+      &.padding {
+        margin: 5px 5px 0 0;
+      }
+    }
+  }
+
+  .icon-exclamation-sign{
+    &.red {
+      color: red;
+    }
+  }
+
+  .sigmaWrapper{
+    position: relative;
+
+    .sigmaModalWrapper{
+      position: absolute;
+      top: 30px;
+      left: 45px;
+      z-index: 1;
+
+      .icon-remove{
+        position: absolute;
+        top: 5px;
+        right: 5px;
+      }
+
+      .tableWrapper{
+        position: relative;
+        background: #f5f5f5;
+        .roundedCorners(5px);
+        min-width: 400px;
+        min-height: 100px;
+        margin-top: 20px;
+        padding: 20px;
+
+        .dataWrapper{
+          overflow-y: scroll;
+          max-height: 350px;
+        }
+
+        .rowWrapper{
+          padding: 10px;
+          margin-bottom: 10px;
+          .roundedCorners(5px);
+          border: 1px solid #d5d5d5;
+        }
+      }
+    }
+  }
+}
+
+.modal-dialog {
+  z-index: 100;
+  height: 700px;
+  width: 700px;
+  background-color: white;
+  position: fixed;
+  opacity: 1;
+  top:50%;
+  left:50%;
+  margin:-350px 0 0 -400px;
+
+  .modal-header {
+    height: 70px;
+    padding: 10px 15px;
+  }
+
+  .modal-navigation {
+    float:left;
+    width: 150px;
+    height: 630px;
+    border-right: 1px solid #e5e5e5;
+    background-color: #eeeeee;
+
+    ul {
+      -webkit-padding-start: 0;
+      list-style-type: none;
+
+      li.navigation-item {
+         height: 54px;
+         width: 100%;
+         background-color: #eeeeee;
+         color: #666;
+         font-weight: bold;
+         padding: 20px;
+
+         &.selected {
+          background-color: #428bca;
+          border-color: #357ebd;
+          color: #ffffff;
+         }
+      }
+    }
+  }
+
+  .modal-content-container {
+    float: right;
+    width: 550px;
+    height: 630px;
+
+    .content {
+      overflow-y: scroll;
+      padding: 0 50px 0 20px;
+      height: 580px;
+    }
+
+    .bottom-navigation {
+      height: 50px;
+      bottom: 0;
+      float: right;
+      margin: 8px 30px
+    } 
+  }
+
+
+
+  
+}
+
+.modal-canvas {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 10;
+  background-color: #000;
+  opacity: .15;
+}
+
+.link-tools .tool-remove { display: none }
+.link-tools .tool-options { display: none }
+.connection-wrap, .marker-arrowheads { display: none }
+
+/*-------------------YangUI import START-------------------*/
+
+@iconsRootPath : 'images/yang-ui-icons/';
+.gbpWrapper{
+  .customContainer{
+    border-left: 1px solid #7a7a7a;
+    margin: 35px 5px 5px 15px;
+    padding: 5px;
+    /*z-index: 10;*/
+    width:auto;
+    position: relative;
+    &.withoutBorder{
+      border-left: 0;
+      padding-bottom: 0;
+      .treeBullet.containerBullet{
+        left: -25px;
+        top: -25px;
+      }
+    }
+  }
+
+  .topContainerPart{
+    margin-left: -19px;
+    margin-top: -28px;
+    margin-bottom: 10px;
+  }
+
+  .treeBullet{
+    font-size: 25px;
+    color: #7a7a7a;
+    position: absolute;
+    left: -15px;
+    top: 0;
+    &.containerBullet{
+      top: -25px; 
+      left: -25px;
+    }
+  }
+
+  .btn-name{
+    -webkit-border-radius: 5px;
+    border-radius: 5px;
+    background: transparent;
+    font-weight: bold;
+    color: @text-color;
+    border: 2px solid @text-color;
+    cursor: auto;
+  }
+
+  button, div{
+    &.yangButton{
+      cursor: pointer;
+      position: relative;
+      width: 24px;
+      height: 24px;
+      border: 0;
+      margin: 2px;
+      .inlineBlock;
+      &.iconArrowDown{
+        background: transparent url('@{iconsRootPath}icon-arrow-down.png') no-repeat center top;
+      }
+      &.iconArrowRight{
+        background: transparent url('@{iconsRootPath}icon-arrow-right.png') no-repeat center top;
+      }
+      &.iconNext{
+        background: transparent url('@{iconsRootPath}icon-next.png') no-repeat center top;
+      }
+      &.iconPrev{
+        background: transparent url('@{iconsRootPath}icon-prev.png') no-repeat center top;
+      }
+      &:hover{
+        background-position: center -24px;
+      }
+      &.disabled{
+        .opacityDeph(0.4)!important;
+        &:hover{
+          background-position: center top;
+        }
+      }
+    }
+  }
+
+  .btn-slim {
+      padding-top: 2px;
+      padding-bottom: 2px;
+  }
+
+  .inlineBlock {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: top;
+      zoom: 1;
+      *display: inline;
+  }
+
+  .leaf {
+      margin: 5px;
+      padding-left: 5px;
+      position: relative;
+  }
+
+  .leaf-label {
+      margin-right: 10px;
+      font-weight: bold;
+      .inlineBlock;
+      /*width: 170px;*/
+      padding-top: 6px;
+      button.iconQuestion{
+        margin-top: -2px;
+      }
+
+      i.icon-key {
+        font-size: 1.3em;
+        padding-left:  5px;
+      }
+  }
+
+  .clear{
+      clear: both;
+  }
+
+  .borderArrow{
+    color: @text-color;
+    position: absolute;
+    bottom: -6px;
+    left: -6px;
+    font-size: 1.3em;
+  }
+
+  .tooltip-inner{
+    color: #fff;
+    white-space: pre-wrap;      /* CSS3 */   
+    white-space: -moz-pre-wrap; /* Firefox */    
+    white-space: -pre-wrap;     /* Opera <7 */   
+    white-space: -o-pre-wrap;   /* Opera 7 */    
+    word-wrap: break-word;      /* IE */
+  }
+}
+/*-------------------YangUI import END-------------------*/
+
+/*
+-------------------JointJS Graph START-------------------
+.html-element {
+  position: absolute;
+  background: #3498DB;
+  pointer-events: none;
+  -webkit-user-select: none;
+  border-radius: 4px;
+  border: 2px solid #2980B9;
+  box-shadow: inset 0 0 5px black, 2px 2px 1px gray;
+  padding: 5px;
+  box-sizing: border-box;
+  z-index: 2;
+  pointer-events: auto;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  color: #333;
+  height: 16px;
+  margin-top: 107px;
+  margin-left: 16px;
+  width: 50px !important;
+  height: 20px !important;
+}
+-------------------JointJS Graph END-------------------
+*/
+
 /*GBP END*/
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
similarity index 96%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.module.js
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.module.js
index 71308d5..39d7f5f
@@ -1,58 +1,58 @@
-define(['angularAMD', 'app/routingConfig', 'ui-bootstrap', 'Restangular', 'angular-translate'], function() {\r
-\r
-  var gbp = angular.module('app.gbp', ['ui.router.state','app.core', 'ui.bootstrap', 'restangular', 'pascalprecht.translate']);\r
-\r
-  gbp.register = gbp;\r
-\r
-  gbp.config(function ($stateProvider, $compileProvider, $controllerProvider, $provide, $translateProvider, NavHelperProvider, $filterProvider) {\r
-\r
-    $translateProvider.useStaticFilesLoader({\r
-      prefix: 'assets/data/locale-',\r
-      suffix: '.json'\r
-    });\r
-\r
-    gbp.register = {\r
-      directive : $compileProvider.directive,\r
-      controller : $controllerProvider.register,\r
-      filter: $filterProvider.register,\r
-      factory : $provide.factory,\r
-      service : $provide.service\r
-    };\r
-\r
-    NavHelperProvider.addControllerUrl('app/gbp/gbp.controller');\r
-    NavHelperProvider.addToMenu('gbp', {\r
-      "link": "#/gbp/index",\r
-      "active": "main.gbp",\r
-      "title": "GBP",\r
-      "icon": "icon-level-down",\r
-      "page": {\r
-        "title": "GBP",\r
-        "description": "GBP"\r
-      }\r
-    });\r
-\r
-    var access = routingConfig.accessLevels;\r
-      $stateProvider.state('main.gbp', {\r
-          url: 'gbp',\r
-          abstract: true,\r
-          views : {\r
-            'content' : {\r
-              templateUrl: 'src/app/gbp/views/root.tpl.html'\r
-            }\r
-          }\r
-      });\r
-\r
-      $stateProvider.state('main.gbp.index', {\r
-          url: '/index',\r
-          access: access.admin,\r
-          views: {\r
-              '': {\r
-                  controller: 'gbpCtrl',\r
-                  templateUrl: 'src/app/gbp/views/index.tpl.html'\r
-              }\r
-          }\r
-      });\r
-  });\r
-\r
-  return gbp;\r
-});\r
+define(['angularAMD', 'app/routingConfig', 'ui-bootstrap', 'Restangular', 'angular-translate'], function() {
+
+  var gbp = angular.module('app.gbp', ['ui.router.state','app.core', 'ui.bootstrap', 'restangular', 'pascalprecht.translate']);
+
+  gbp.register = gbp;
+
+  gbp.config(function ($stateProvider, $compileProvider, $controllerProvider, $provide, $translateProvider, NavHelperProvider, $filterProvider) {
+
+    $translateProvider.useStaticFilesLoader({
+      prefix: 'assets/data/locale-',
+      suffix: '.json'
+    });
+
+    gbp.register = {
+      directive : $compileProvider.directive,
+      controller : $controllerProvider.register,
+      filter: $filterProvider.register,
+      factory : $provide.factory,
+      service : $provide.service
+    };
+
+    NavHelperProvider.addControllerUrl('app/gbp/gbp.controller');
+    NavHelperProvider.addToMenu('gbp', {
+      "link": "#/gbp/index",
+      "active": "main.gbp",
+      "title": "GBP",
+      "icon": "icon-level-down",
+      "page": {
+        "title": "GBP",
+        "description": "GBP"
+      }
+    });
+
+    var access = routingConfig.accessLevels;
+      $stateProvider.state('main.gbp', {
+          url: 'gbp',
+          abstract: true,
+          views : {
+            'content' : {
+              templateUrl: 'src/app/gbp/views/root.tpl.html'
+            }
+          }
+      });
+
+      $stateProvider.state('main.gbp.index', {
+          url: '/index',
+          access: access.admin,
+          views: {
+              '': {
+                  controller: 'gbpCtrl',
+                  templateUrl: 'src/app/gbp/views/index.tpl.html'
+              }
+          }
+      });
+  });
+
+  return gbp;
+});
old mode 100755 (executable)
new mode 100644 (file)
similarity index 97%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/gbp.services.js
index 064fd5c..ef75e0a
-define(['app/gbp/gbp.module', 'app/gbp/js/joint.clean.build'], function(gbp, joint) {\r
-\r
-    gbp.register.factory('GBPRestangular', function(Restangular, ENV) {\r
-        return Restangular.withConfig(function(RestangularConfig) {\r
-            RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL"));\r
-        });\r
-    });\r
-\r
-    gbp.register.factory('GBPConstants', function() {\r
-        var c = { colors: {'graph' : {}}, strings: {}, jointElements: {}, objType: {}, numbers: {}};\r
-\r
-        c.strings.flood = 'flood';\r
-        c.strings.bridge = 'bridge';\r
-        c.strings.l3ctx = 'l3ctx';\r
-        c.strings.subnet = 'subnet';\r
-        c.strings.linklabel = 'linklabel';\r
-        c.strings.in = 'in';\r
-        c.strings.out = 'out';\r
-        c.strings.bi = 'bidirectional';\r
-\r
-        c.strings.config = 'CONFIG';\r
-        c.strings.oper = 'OPERATIONAL';\r
-        c.strings.l2l3 = 'L2L3';\r
-        c.strings.mock = 'MOCK';\r
-        c.strings.sigmaTopoDefaultText = 'SIGMATOPODEFAULTTEXT';\r
-        c.strings.sigmaTopoDefault = 'SIGMATOPODEFAULTTEXT';\r
-\r
-        c.colors[c.strings.flood] = '#DF0101';\r
-        c.colors[c.strings.bridge] = '#0080FF';\r
-        c.colors[c.strings.l3ctx] = '#3ADF00';\r
-        c.colors[c.strings.subnet] = '#FF9933';\r
-        c.colors[c.strings.sigmaTopoDefaultText] = '#fff';\r
-        c.colors[c.strings.epg] = '#8fde70';\r
-        c.colors[c.strings.linklabel] = '#3366CC';\r
-\r
-        c.colors[c.strings.flood+'-'+c.strings.bridge] = '#6666FF';\r
-        c.colors[c.strings.bridge+'-'+c.strings.l3ctx] = '#6666FF';\r
-\r
-        c.colors[c.strings.subnet+'-'] = '#6666FF';\r
-\r
-        c.colors['graph']['subject'] = '#FFFFD4';\r
-        c.colors['graph']['cns'] = '#8EEDFF';\r
-        c.colors['graph']['pns'] = '#FF9C9C';\r
-\r
-        c.jointElements.minWidth = 100;\r
-        c.jointElements.maxWidth = 300;\r
-        c.jointElements.minHeight = 50;\r
-        c.jointElements.maxHeight = 300;\r
-\r
-        c.objType.contract = 'contract';\r
-        c.objType.epg = 'epg';\r
-        c.objType.consumer = 'consumer';\r
-        c.objType.provider = 'provider';\r
-        c.objType.subject = 'subject';\r
-        c.objType.rule = 'rule';\r
-\r
-        c.numbers.displayLabelLength = 40;\r
-\r
-        return c;\r
-    });\r
-\r
-    gbp.register.factory('MockServices', function() {\r
-\r
-        var ms = {};\r
-\r
-        ms.mockTopoData = function() {\r
-            var lid = 0,\r
-                nodeRaw = [0, 1, 2, 3],\r
-                linkRaw = [[0, 1], [2, 3], [3, 0], [0, 3]],\r
-                nodes = nodeRaw.map(function(data) {\r
-                    return {\r
-                                'id': 'n' + data,\r
-                                'label': 'LABEL'+data,\r
-                                'size': 3,\r
-                                'x': Math.random(),\r
-                                'y': Math.random(),\r
-                                'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
-                            };\r
-                }),\r
-                links = linkRaw.map(function(data) {\r
-                    var obj = {\r
-                                id: 'e' + lid,\r
-                                source: 'n' + data[0],\r
-                                target: 'n' + data[1],\r
-                                color: GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
-                            };\r
-                    lid = lid + 1;\r
-                    return obj;\r
-                });\r
-\r
-            return {nodes: nodes, links: links};\r
-        };\r
-\r
-        return ms;\r
-    });\r
-\r
-    gbp.register.factory('TopologyDataLoaders', function(GBPRestangular, GBPConstants) {\r
-        var tdl = {};\r
-\r
-        tdl.getSubjectsBetweenEndpointGroups = function(storage, tenantId, successCbk, errorCbk) {\r
-            var restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'ui-backend:get-subjects-between-endpoint-groups',\r
-                reqData = { "input": { "tenant-id": tenantId }};\r
-\r
-            if(storage) {\r
-                reqData.input['from-oper-data'] = {};\r
-            }\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                // console.info('got data', data.output);\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        //Policies are representing links in PGN topology\r
-        tdl.getGroupRulesBetweenEndpointGroups = function(successCbk, errorCbk) {\r
-            var restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'pgn-application:get-group-rules-between-endpoint-groups',\r
-                reqData = { "input": { "endpoint-group-pair":[] }};\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                successCbk(data); //set topology links\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        //Groups are representing nodes in PGN topology\r
-        tdl.getEndpointGroups = function(successCbk, errorCbk) {\r
-            var tenantId = getId(idTypes.tenant),\r
-                restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'pgn-application:get-endpoint-groups',\r
-                reqData = {\r
-                            "input": {\r
-                                "endpoint-group-id":[\r
-                                    {\r
-                                        "pgn-application:tenant-id": tenantId\r
-                                    }\r
-                                ]\r
-                            }\r
-                        };\r
-\r
-          restObj.post(rpcRes, reqData).then(function(data) {\r
-              successCbk(data); //set topology nodes\r
-          }, function(res) {\r
-              errorCbk(res);\r
-          });\r
-\r
-        };\r
-\r
-        tdl.getEndpointsFromEndpointGroup = function(tenantId, epgId, successCbk, errorCbk) {\r
-            var restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'ui-backend:get-endpoints-from-endpoint-group',\r
-                reqData = {\r
-                            "input": {\r
-                                "tenant-id": tenantId,\r
-                                "endpoint-group-id":epgId\r
-                            }\r
-                        };\r
-\r
-          restObj.post(rpcRes, reqData).then(function(data) {\r
-              successCbk(data); //set topology nodes\r
-          }, function(res) {\r
-              errorCbk(res);\r
-          });\r
-\r
-        };\r
-\r
-        tdl.getEpgTopo = function(data){\r
-            var epgData = data.output['endpoint-group-pair-with-subject'],\r
-                nodes = [],\r
-                edges = [],\r
-                setNode = function(obj){\r
-                    var nodeObj = {\r
-                            'id': 'n' + nodes.length,\r
-                            'label': obj.name || obj.id,\r
-                            'name': obj.name,\r
-                            'size': 1,\r
-                            'x': Math.random(),\r
-                            'y': Math.random(),\r
-                            'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault],\r
-                            'type': obj.type\r
-                        };\r
-\r
-                    nodes.push(nodeObj);\r
-                    return nodeObj.id;\r
-                },\r
-                setEdge = function(sourceId, destId, data, direction) {\r
-                    var obj = {\r
-                            'id': 'e' + edges.length,\r
-                            'source': sourceId,\r
-                            'target': destId,\r
-                            'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault],\r
-                            'data': data,\r
-                            'direction' : direction\r
-                            // 'type': 'curve',\r
-                            // 'size' : 100\r
-                        };\r
-\r
-                    edges.push(obj);\r
-                },\r
-                getObjByProp = function(val, prop, list) {\r
-                    return list.filter(function(i){\r
-                        return i[prop] === val;\r
-                    });\r
-                },\r
-                getDirection = function(subjects){\r
-                    var directions = [];\r
-                    if ( subjects ) {\r
-                        subjects.forEach(function(s){\r
-                            if ( s['ui-rule'] ) {\r
-                                s['ui-rule'].forEach(function(rule){\r
-                                    if ( rule['classifier-ref'] ) {\r
-                                        rule['classifier-ref'].forEach(function(classifier){\r
-                                            if ( classifier.direction && directions.indexOf(classifier.direction) === -1 ){\r
-                                                directions.push(classifier.direction);\r
-                                            }\r
-                                        });\r
-                                    }\r
-                                });\r
-                            }\r
-                        });\r
-                    }\r
-                    return directions.length === 1 ? directions[0] : directions.length > 1 ? 'bidirectional' : null;\r
-\r
-                };\r
-\r
-            if(epgData) {\r
-                epgData.forEach(function(e){\r
-                    var cepgnId = null,\r
-                        pepgnId = null;\r
-\r
-                    if ( !getObjByProp(e['consumer-endpoint-group-id'],'name', nodes).length ) {\r
-                        var objCepg = {\r
-                            type: 'epg',\r
-                            name: e['consumer-endpoint-group-id']\r
-                        };\r
-                        cepgnId = setNode(objCepg);\r
-                    } else {\r
-                        cepgnId = getObjByProp(e['consumer-endpoint-group-id'],'name', nodes)[0].id;\r
-                    }\r
-                    if ( !getObjByProp(e['provider-endpoint-group-id'],'name', nodes).length ) {\r
-                        var objPepg = {\r
-                            type: 'epg',\r
-                            name: e['provider-endpoint-group-id']\r
-                        };\r
-                        pepgnId = setNode(objPepg);\r
-                    } else {\r
-                        pepgnId = getObjByProp(e['provider-endpoint-group-id'],'name', nodes)[0].id;\r
-                    }\r
-\r
-                    var direction = getDirection(e['ui-subject']);\r
-\r
-                    if ( cepgnId && pepgnId ) {\r
-                        setEdge(cepgnId, pepgnId, e['ui-subject'], direction);\r
-                    }\r
-                });\r
-            }\r
-\r
-            return {\r
-                nodes: nodes,\r
-                links: edges\r
-            };\r
-        };\r
-\r
-        \r
-        tdl.getL2L3 = function(storage, tenantId, successCbk, errorCbk) {\r
-            //l2-bridge-domain\r
-            var lid = 0,\r
-                nid = 0,\r
-                getL2L3Label = function(node) {\r
-                    return node.name || node.id;\r
-                },\r
-                getSubnetLabel = function(node) {\r
-                    return node['ip-prefix'] || node.id;\r
-                },\r
-                getNodeColor = function(src) {\r
-                    return GBPConstants.colors[src] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];\r
-                },\r
-                getLinkColor = function(from, to) {\r
-                    return GBPConstants.colors[from+'-'+to] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];\r
-                },\r
-                getNodes = function(data, srcDesc, getLabelCbk) {\r
-                    var nodes = data.map(function(elem) {\r
-                        var obj = {\r
-                            'id': 'n' + nid,\r
-                            'label': getLabelCbk(elem),\r
-                            'uuid': elem.id,\r
-                            'size': 3,\r
-                            'x': Math.random(),\r
-                            'y': Math.random(),\r
-                            'color': getNodeColor(srcDesc),\r
-                            'elemType': srcDesc\r
-                        };\r
-\r
-                        nid += 1;\r
-                        return obj;\r
-                    });\r
-\r
-                    return nodes;\r
-                },\r
-                getLinks = function(data, srcNodes, targetNodes, fromDesc, toDesc) {\r
-                    var findByUUID = function(array, uuid) {\r
-                        return array.filter(function(elem) {\r
-                            return elem.uuid === uuid;\r
-                        })[0];\r
-                    };\r
-\r
-                    var links = data.map(function(elem) {\r
-                        var obj = null,\r
-                            src = findByUUID(srcNodes, elem.id),\r
-                            trg = findByUUID(targetNodes, elem.parent);\r
-\r
-                        if(src && trg) {\r
-                            obj = {\r
-                                'id': 'e' + lid,\r
-                                'source': src.id,\r
-                                'target': trg.id,\r
-                                'color': getLinkColor(fromDesc, toDesc)\r
-                            };\r
-                            lid += 1;\r
-                        }\r
-\r
-                        return obj;\r
-                    }).filter(function(elem) {\r
-                        return elem !== null;\r
-                    });\r
-\r
-                    return links;\r
-                };\r
-\r
-            restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId);\r
-\r
-            restObj.get().then(function(data) {\r
-                var l2FloodNodes = getNodes(data.tenant[0]['l2-flood-domain'] || [], GBPConstants.strings.flood, getL2L3Label),\r
-                    l2BridgeNodes = getNodes(data.tenant[0]['l2-bridge-domain'] || [], GBPConstants.strings.bridge, getL2L3Label),\r
-                    l3ContextNodes = getNodes(data.tenant[0]['l3-context'] || [], GBPConstants.strings.l3ctx, getL2L3Label),\r
-                    subnetNodes = getNodes(data.tenant[0]['subnet'] || [], GBPConstants.strings.subnet, getSubnetLabel),\r
-                    l2FloodLinks = getLinks(data.tenant[0]['l2-flood-domain'] || [], l2FloodNodes, l2BridgeNodes, GBPConstants.strings.flood, GBPConstants.strings.bridge),\r
-                    l2BridgeLinks = getLinks(data.tenant[0]['l2-bridge-domain'] || [], l2BridgeNodes, l3ContextNodes, GBPConstants.strings.bridge, GBPConstants.strings.l3ctx),\r
-                    subnetLinks = getLinks(data.tenant[0]['subnet'] || [], subnetNodes, l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes), GBPConstants.strings.subnet, ''),\r
-                    allNodes = l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes).concat(subnetNodes),\r
-                    allLinks = l2BridgeLinks.concat(l2FloodLinks).concat(subnetLinks);\r
-\r
-                successCbk(allNodes, allLinks);\r
-            }, function(res) {\r
-                errorCbk(res.data, res.status);\r
-            });\r
-        };\r
-\r
-        tdl.getClassifierInstances = function() {\r
-\r
-        };\r
-\r
-        return tdl;\r
-    });\r
-\r
-    gbp.register.factory('TopoServices', function(TopologyDataLoaders, MockServices, GBPConstants) {\r
-\r
-        var ts = {};\r
-\r
-        var loaders = {};\r
-\r
-        var legends = {};\r
-\r
-        var transformPGNTopoNodes = function(data) {\r
-            return data.output['endpoint-group'].map(function(d) {\r
-                return {\r
-                    id: d.id,\r
-                    group: d.name,\r
-                    sgt: d['security-group-tag']\r
-                };\r
-            });\r
-        };\r
-\r
-        var transformPGNTopoLinks = function(data) {\r
-            return data.output['endpoint-group-pair-with-rules'].map(function(d) {\r
-                return {\r
-                    source: d['provider-group-id'],\r
-                    target: d['consumer-group-id'],\r
-                    policy: d['group-rule'][0]['action-ref'].map(function(r) {\r
-                        return r.name;\r
-                    })\r
-                };\r
-            });\r
-        };\r
-\r
-        var gbpLegend = {\r
-            'epg' : GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
-        };\r
-\r
-        legends[GBPConstants.strings.empty] = {};\r
-        legends[GBPConstants.strings.config] = gbpLegend;\r
-        legends[GBPConstants.strings.oper] = gbpLegend;\r
-        legends[GBPConstants.strings.mock] = gbpLegend;\r
-        legends[GBPConstants.strings.l2l3] = {\r
-            'l2-flood': GBPConstants.colors[GBPConstants.strings.flood],\r
-            'l2-bridge': GBPConstants.colors[GBPConstants.strings.bridge],\r
-            'l3-context': GBPConstants.colors[GBPConstants.strings.l3ctx],\r
-            'subnet': GBPConstants.colors[GBPConstants.strings.subnet],\r
-            'link': GBPConstants.colors[GBPConstants.strings.subnet+'-']\r
-        };\r
-\r
-        loaders[GBPConstants.strings.empty] = function(successCbk, errorCbk) {\r
-            successCbk([], []);\r
-        };\r
-\r
-        loaders[GBPConstants.strings.config] = function(successCbk, errorCbk, args) {\r
-            var storage = args.storage || 'config',\r
-                tenantId = args.tenantId;\r
-                \r
-       \r
-            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){\r
-                var topo = TopologyDataLoaders.getEpgTopo(data);\r
-                successCbk(topo.nodes, topo.links);\r
-                //successCbk\r
-            }, errorCbk);\r
-        };\r
-\r
-        loaders[GBPConstants.strings.oper] = function(successCbk, errorCbk, args) {\r
-            var storage = args.storage || 'config',\r
-                tenantId = args.tenantId;\r
-\r
-            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){\r
-                var topo = TopologyDataLoaders.getEpgTopo(data);\r
-                successCbk(topo.nodes, topo.links);\r
-                //successCbk\r
-            }, errorCbk);\r
-        };\r
-\r
-        loaders[GBPConstants.strings.l2l3] = function(successCbk, errorCbk, args) {\r
-            var storage = args.storage || 'config',\r
-                tenantId = args.tenantId;\r
-\r
-            if(storage && tenantId) {\r
-                TopologyDataLoaders.getL2L3(storage, tenantId, successCbk, errorCbk);\r
-            } else {\r
-                //different kind of error\r
-                errorCbk();\r
-            }\r
-        };\r
-\r
-        loaders[GBPConstants.strings.mock] = function(successCbk, errorCbk) {\r
-            var data = MockServices.mockTopoData();\r
-            successCbk(data.nodes, data.links);\r
-        };\r
-\r
-        ts.getConsProvLabel = function(edge, topo){\r
-            var provName = '',\r
-                conName = '';\r
-\r
-            topo.nodes.forEach(function(n){\r
-\r
-                if ( edge.source === n.id ) {\r
-                    provName = n.name;\r
-                }\r
-\r
-                if ( edge.target === n.id ) {\r
-                    conName = n.name;\r
-                }\r
-            });\r
-\r
-            return provName + ':' + conName;\r
-        };\r
-\r
-        ts.getLegend = function(type) {\r
-            if(type === null || legends.hasOwnProperty(type) === false) {\r
-                type = GBPConstants.strings.empty;\r
-            }\r
-\r
-            return legends[type];\r
-        };\r
-\r
-        ts.loadTopology = function(type, successCbk, errorCbk, args) {\r
-            if(type === null || loaders.hasOwnProperty(type) === false) {\r
-                type = GBPConstants.strings.empty;\r
-            }\r
-\r
-            loaders[type](successCbk, errorCbk, args);\r
-        };\r
-\r
-        return ts;\r
-    });\r
-\r
-    gbp.register.factory('GPBServices', function(GBPRestangular) {\r
-\r
-        var s = {};\r
-\r
-        s.getDefinitions = function(successCbk, errorCbk) {\r
-            var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');\r
-\r
-            restObj.get().then(function(data) {\r
-                if(data['subject-feature-definitions']) {\r
-                    var classifiersDefs = data['subject-feature-definitions']['classifier-definition'] || [],\r
-                        actionsDefs = data['subject-feature-definitions']['action-definition'] || [];\r
-                        successCbk(classifiersDefs, actionsDefs);\r
-                } else {\r
-                    //TODO log error\r
-                }\r
-            }, function(res) {\r
-                // errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.getServiceFunctionChains = function(successCbk, errorCbk) {\r
-            var restObj = GBPRestangular.one('restconf').one('config').one('service-function-chain:service-function-chains');\r
-\r
-            restObj.get().then(function(data) {\r
-                if(data['service-function-chains']) {\r
-                    successCbk(data['service-function-chains']['service-function-chain']);\r
-                } else {\r
-                    //TODO log error\r
-                }\r
-            }, function(res) {\r
-                // errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.getUUIDnumber = function() {\r
-            var d = new Date().getTime();\r
-            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r
-                        var r = (d + Math.random()*16)%16 | 0;\r
-                        d = Math.floor(d/16);\r
-                        return (c=='x' ? r : (r&0x3|0x8)).toString(16);\r
-                    });\r
-        };\r
-\r
-        s.createRestObj = function(storage) {\r
-            storage = storage || 'config';\r
-            restObj = GBPRestangular.one('restconf').one(storage);\r
-\r
-            return restObj;\r
-        };\r
-\r
-        s.send = function(restObj, reqData, successCbk, errorCbk) {\r
-            restObj.customPUT(reqData).then(function(data) {\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res.data, res.status);\r
-            });\r
-        };\r
-\r
-        s.post = function(restObj, reqData, successCbk, errorCbk) {\r
-            restObj.customPOST(reqData).then(function(data) {\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res.data, res.status);\r
-            });\r
-        };\r
-\r
-        s.delete = function(restObj, successCbk, errorCbk) {\r
-            restObj.remove().then(function(data) {\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res.data, res.status);\r
-            });\r
-        };\r
-\r
-        s.load = function(restObj, transformCallback, successCbk, errorCbk) {\r
-            restObj.get().then(function(data) {\r
-                var objs = transformCallback(data) || [];\r
-                successCbk(objs);\r
-            }, function(res) {\r
-                errorCbk(res.data, res.status);\r
-            });\r
-        };\r
-\r
-        s.stripNullValues = function(obj) {\r
-            Object.keys(obj).forEach(function(k) {\r
-                if(obj[k] === null) {\r
-                    delete obj[k];\r
-                }\r
-            });\r
-\r
-            return obj;\r
-        };\r
-\r
-        s.removeEmptyElementsFromList = function(list) {\r
-            return list.filter(function(e) {\r
-                return e !== "";\r
-            });\r
-        };\r
-\r
-        s.createParamObj = function(name, type, value) {\r
-            var obj = { name: name };\r
-\r
-            obj[type+'-value'] = value;\r
-\r
-            return obj;\r
-        };\r
-\r
-        s.getInstanceParamValue = function(param) {\r
-            return param['int-value'] || param['string-value'] || param['range-value'];\r
-        };\r
-\r
-        s.getDefinitionObjParams = function(defObj, id) {\r
-            var obj = defObj.filter(function(def) {\r
-                    return def.id === id;\r
-                })[0],\r
-                params = (obj && obj.parameter) ? obj.parameter : [];\r
-\r
-            return params;\r
-\r
-        };\r
-\r
-        s.getPropFromListByProp = function(list, propSrc, targetValue, propDst) {\r
-            var output = null,\r
-                selectedObj = list.filter(function(e) {\r
-                    return e[propSrc] === targetValue;\r
-                })[0];\r
-\r
-            if(selectedObj) {\r
-                if(propDst) {\r
-                    output = selectedObj[propDst];\r
-                } else {\r
-                    output = selectedObj;\r
-                }\r
-            }\r
-\r
-            return output;\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPGovernanceServices', function(TopologyDataLoaders) {\r
-        var s = {};\r
-\r
-        var subjectInList = function(subjectName, subjectList) {\r
-            return subjectList.some(function(s) {\r
-                return s.name === subjectName;\r
-            });\r
-        };\r
-\r
-        var EPG = function(epgId, tenantId) {\r
-            this.id = epgId;\r
-            this.tenantId = tenantId;\r
-        };\r
-\r
-        var Subject = function(name) {\r
-            this.name = name;\r
-            this.rules = [];\r
-            this.providers = [];\r
-            this.consumers = [];\r
-\r
-            this.addProvider = function(providingEpg) {\r
-                if(this.providers.indexOf(providingEpg) === -1) {\r
-                    this.providers.push(providingEpg);\r
-                }\r
-            };\r
-\r
-            this.addConsumer = function(consumingEpg) {\r
-                if(this.consumers.indexOf(consumingEpg) === -1) {\r
-                    this.consumers.push(consumingEpg);\r
-                }\r
-            };\r
-\r
-            this.addRule = function(rule, classifierInstances) {\r
-                if(rule['classifier-ref'] && rule['classifier-ref'].length > 0) {\r
-                    \r
-                    rule['classifier-ref'].forEach(function(cr) {\r
-                        //cr['parameters'] = [];\r
-                        classifierInstances.forEach(function(ci) {\r
-                            if(ci['name'] === cr['instance-name']) {\r
-                                cr['parameters'] = ci['parameter-value'];\r
-                            }\r
-                        });\r
-                    });\r
-                }\r
-\r
-                this.rules.push(rule);\r
-            };\r
-        };\r
-\r
-        var addEpg = function(epgList, epgId, tenantId) {\r
-                var addedEpg = null;\r
-\r
-                if(epgList.some(function(epg) {\r
-                    return epg.id === epgId && epg.tenantId === tenantId;\r
-                }) === false) {\r
-                    addedEpg = new EPG(epgId, tenantId);\r
-                }\r
-\r
-                if(addedEpg !== null) {\r
-                    epgList.push(addedEpg);\r
-                }\r
-\r
-                return addedEpg;\r
-            },\r
-            addSubject = function(subject, subjects, providerEpg, consumerEpg, classifierInstances) {\r
-                //console.log('classifierInstances:', classifierInstances);\r
-                var existingSubject = subjects.filter(function(s) {\r
-                        return s.name === subject.name;\r
-                    })[0],\r
-                    newSubject = (existingSubject === undefined);\r
-\r
-                if(newSubject) {\r
-                    existingSubject = new Subject(subject.name);\r
-                }\r
-\r
-                existingSubject.addProvider(providerEpg);\r
-                existingSubject.addConsumer(consumerEpg);\r
-                \r
-                if(subject['ui-rule'] && subject['ui-rule'].length > 0) {\r
-                    subject['ui-rule'].forEach(function(r) {\r
-                        existingSubject.addRule(r, classifierInstances);\r
-                    });\r
-                }\r
-                \r
-                if(newSubject) {\r
-                    subjects.push(existingSubject);\r
-                }\r
-            },\r
-            processPairData = function(providers, consumers, subjects, pairData, classifierInstances) {\r
-                addEpg(providers, pairData['provider-endpoint-group-id'], pairData['provider-tenant-id']);\r
-                addEpg(consumers, pairData['consumer-endpoint-group-id'], pairData['consumer-tenant-id']);\r
-\r
-                pairData['ui-subject'].forEach(function(s) {\r
-                    addSubject(s, subjects, pairData['provider-endpoint-group-id'], pairData['consumer-endpoint-group-id'], classifierInstances);\r
-                });\r
-            };\r
-\r
-        s.getEPGsAndSubjects = function(tenantId, classifierInstances, successCbk, errorCbk) {\r
-            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, \r
-                function(data) {\r
-                    var epgPairs = data.output['endpoint-group-pair-with-subject'],\r
-                        consumers = [],\r
-                        providers = [],\r
-                        subjects = [];\r
-\r
-                    if(epgPairs) {\r
-                        epgPairs.forEach(function(p) {\r
-                            processPairData(providers, consumers, subjects, p, classifierInstances);\r
-                        });\r
-                    }\r
-\r
-                    successCbk({providers: providers, consumers: consumers, subjects: subjects});\r
-                },\r
-                function() {\r
-                    //TODO log error\r
-            });\r
-        };\r
-\r
-        return s;\r
-    });\r
-\r
-    gbp.register.factory('GBPTenantServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Tenant = function(id, name, description) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.name = name || null;\r
-            this.description = description || null;\r
-        };\r
-\r
-        var createBaseRestObj = function() {\r
-            return GPBServices\r
-                .createRestObj().one('policy:tenants');\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj().one('tenant').one(pathObj.tenantId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new Tenant(rawObj.id, rawObj.name, rawObj.description);\r
-            // });\r
-            return rawData.tenants.tenant;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { tenant : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId) {\r
-            return {\r
-                tenantId: tenantId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Tenant();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.modify = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj();\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPContractServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Contract = function(id, description, parent) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.description = description || null;\r
-            this.parent = parent || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj().one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('contract').one(pathObj.contractId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new Contract(rawObj.id, rawObj.description);\r
-            // });\r
-            return rawData.tenant[0].contract;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { contract : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, contractId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                contractId: contractId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Contract();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPClauseServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Clause = function(name, subjectRefs) {\r
-            this.name = name || null;\r
-            this['subject-refs'] = subjectRefs || [];\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId)\r
-                .one('contract').one(pathObj.contractId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('clause').one(pathObj.clauseId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            var data = null,\r
-                clauseData = rawData.contract[0].clause;\r
-\r
-            if(clauseData) {\r
-                data = clauseData.map(function(elem) {\r
-                    if(elem.hasOwnProperty('subject-refs') === false) {\r
-                        elem['subject-refs'] = [];\r
-                    }\r
-                    return elem;\r
-                });\r
-            }\r
-\r
-            return data;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            var o = GPBServices.stripNullValues(obj);\r
-\r
-            if(o['subject-refs']) {\r
-                o['subject-refs'] = GPBServices.removeEmptyElementsFromList(o['subject-refs']);\r
-            }\r
-\r
-            return { clause : [ o ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, contractId, clauseId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                contractId: contractId,\r
-                clauseId: clauseId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Clause();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPSubjectServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Subject = function(name, order) {\r
-            this.name = name || null;\r
-            this.order = order || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId)\r
-                .one('contract').one(pathObj.contractId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('subject').one(pathObj.subjectId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new Subject(rawObj.name, rawObj.order);\r
-            // });\r
-            return rawData.contract[0].subject;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { subject : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, contractId, subjectId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                contractId: contractId,\r
-                subjectId: subjectId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Subject();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPRuleServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Rule = function(name, order) {\r
-            this.name = name || null;\r
-            this.order = order || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant')\r
-                .one(pathObj.tenantId).one('contract').one(pathObj.contractId)\r
-                .one('subject').one(pathObj.subjectId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('rule').one(pathObj.ruleId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new Rule(rawObj.name, rawObj.order);\r
-            // });\r
-            return rawData.subject[0].rule;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { rule : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, contractId, subjectId, ruleId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                contractId: contractId,\r
-                subjectId: subjectId,\r
-                ruleId: ruleId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Rule();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPClassifierRefsServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var ClassifierRef = function(name, direction, instanceName, connectionTracking) {\r
-            this.name = name || null;\r
-            this.direction = direction || null;\r
-            this['instance-name'] = instanceName || null;\r
-            this['connection-tracking'] = connectionTracking || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant')\r
-                .one(pathObj.tenantId).one('contract').one(pathObj.contractId)\r
-                .one('subject').one(pathObj.subjectId)\r
-                .one('rule').one(pathObj.ruleId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('classifier-ref').one(pathObj.classifierRefId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new ClassifierRef(rawObj.name, rawObj.direction, rawObj['instance-name']);\r
-            // });\r
-            return rawData.rule[0]['classifier-ref'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'classifier-ref' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, contractId, subjectId, ruleId, classifierRefId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                contractId: contractId,\r
-                subjectId: subjectId,\r
-                ruleId: ruleId,\r
-                classifierRefId: classifierRefId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new ClassifierRef();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPActionRefsServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var ActionRef = function(name, order, instanceName) {\r
-            this.name = name || null;\r
-            this.order = order || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant')\r
-                .one(pathObj.tenantId).one('contract').one(pathObj.contractId)\r
-                .one('subject').one(pathObj.subjectId)\r
-                .one('rule').one(pathObj.ruleId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('action-ref').one(pathObj.actionRefId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new ActionRef(rawObj.name, rawObj.order);\r
-            // });\r
-            return rawData.rule[0]['action-ref'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'action-ref' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, contractId, subjectId, ruleId, actionRefId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                contractId: contractId,\r
-                subjectId: subjectId,\r
-                ruleId: ruleId,\r
-                actionRefId: actionRefId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new ActionRef();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPL2FloodDomainServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var L2FloodDomain = function(id, name, description, parent) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.name = name || null;\r
-            this.description = description || null;\r
-            this.parent = parent || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('l2-flood-domain').one(pathObj.l2FloodDomain);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new L2FloodDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent);\r
-            // });\r
-            return rawData.tenant[0]['l2-flood-domain'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'l2-flood-domain' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, l2FloodDomain) {\r
-            return {\r
-                tenantId: tenantId,\r
-                l2FloodDomain: l2FloodDomain\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new L2FloodDomain();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPL2BridgeDomainServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var L2BridgeDomain = function(id, name, description, parent) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.name = name || null;\r
-            this.description = description || null;\r
-            this.parent = parent || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant')\r
-                .one(pathObj.tenantId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('l2-bridge-domain').one(pathObj.l2BridgeDomain);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new L2BridgeDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent);\r
-            // });\r
-            return rawData.tenant[0]['l2-bridge-domain'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'l2-bridge-domain' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, l2BridgeDomain) {\r
-            return {\r
-                tenantId: tenantId,\r
-                l2BridgeDomain: l2BridgeDomain\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new L2BridgeDomain();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPL3ContextServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var L3Context = function(id, name, description) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.name = name || null;\r
-            this.description = description || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('l3-context').one(pathObj.l3Context);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
-            // });\r
-            return rawData.tenant[0]['l3-context'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'l3-context' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, l3Context) {\r
-            return {\r
-                tenantId: tenantId,\r
-                l3Context: l3Context\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new L3Context();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPSubnetServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Subnet = function(id, name, description, parent, ipPrefix, virtualRouterIp) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.name = name || null;\r
-            this.description = description || null;\r
-            this.parent = parent || null;\r
-            this['ip-prefix'] = ipPrefix || null;\r
-            this['virtual-router-ip'] = virtualRouterIp || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('subnet').one(pathObj.subnet);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
-            // });\r
-            return rawData.tenant[0]['subnet'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'subnet' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, subnet) {\r
-            return {\r
-                tenantId: tenantId,\r
-                subnet: subnet\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Subnet();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPGatewayServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Gateway = function(gateway) {\r
-            this.gateway = gateway || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('gateways').one(pathObj.gateway);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
-            // });\r
-            return rawData.subnet[0]['gateways'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'gateways' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, subnetId, gateway) {\r
-            return {\r
-                tenantId: tenantId,\r
-                subnetId: subnetId,\r
-                gateway: gateway\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Gateway();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPPrefixServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Prefix = function(prefix) {\r
-            this.prefix = prefix || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId).one('gateways').one(pathObj.gatewayId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('prefixes').one(pathObj.prefixId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            // return rawData.map(function(rawObj){\r
-            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
-            // });\r
-            return rawData.gateways[0].prefixes;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'prefixes' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, subnetId, gatewayId, prefixId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                subnetId: subnetId,\r
-                gatewayId: gatewayId,\r
-                prefixId: prefixId ? prefixId.replace("/", "%2F") : prefixId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new Prefix();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPClassifierInstanceServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var ClassifierService = function(name, classifierDefId) {\r
-            this.name = name || null;\r
-            this['classifier-definition-id'] = classifierDefId || null;\r
-            this['parameter-value'] = [];\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances');\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('classifier-instance').one(pathObj.classfierInstanceId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            return rawData['subject-feature-instances']['classifier-instance'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'classifier-instance' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, classfierInstanceId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                classfierInstanceId: classfierInstanceId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new ClassifierService();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPActionInstanceServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var ActionService = function(name, actionDefId) {\r
-            this.name = name || null;\r
-            this['action-definition-id'] = actionDefId || null;\r
-            this['parameter-value'] = [];\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances');\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('action-instance').one(pathObj.actionInstanceId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            return rawData['subject-feature-instances']['action-instance'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'action-instance' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, actionInstanceId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                actionInstanceId: actionInstanceId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new ActionService();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        s.getDefinitions = function(successCbk, errorCbk) {\r
-            var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');\r
-                \r
-            restObj.get().then(function(data) {\r
-                successCbk(data['subject-feature-definitions']['action-definition']);\r
-            }, function(res) {\r
-                // errorCbk(res);\r
-            });\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPEpgServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var EPG = function(name, description, intraGroupPolicy, networkDomain, id, parent) {\r
-            this.id = id || GPBServices.getUUIDnumber();\r
-            this.name = name || null;\r
-            this.description = description || null;\r
-            this['intra-group-policy'] = intraGroupPolicy || null;\r
-            this['network-domain'] = networkDomain || null;\r
-            this.parent = parent || null;\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('endpoint-group').one(pathObj.epgId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            return rawData.tenant[0]['endpoint-group'];\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            return { 'endpoint-group' : [ GPBServices.stripNullValues(obj) ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, epgId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                epgId: epgId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new EPG();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPConNamedSelServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var ConsumerNamedSelector = function(name, contract) {\r
-            this.name = name || null;\r
-            this.contract = contract || [];\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('consumer-named-selector').one(pathObj.cnsId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            var data = null,\r
-                consumerData = rawData['endpoint-group'][0]['consumer-named-selector'];\r
-\r
-            if(consumerData) {\r
-                data = consumerData.map(function(elem) {\r
-                    if(elem.hasOwnProperty('contract') === false) {\r
-                        elem.contract = [];\r
-                    }\r
-                    return elem;\r
-                });\r
-            }\r
-\r
-            return data;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            var o = GPBServices.stripNullValues(obj);\r
-\r
-            if(o.contract) {\r
-                o.contract = GPBServices.removeEmptyElementsFromList(o.contract);\r
-            }\r
-\r
-            return { 'consumer-named-selector' : [ o ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, epgId, cnsId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                epgId: epgId,\r
-                cnsId: cnsId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new ConsumerNamedSelector();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-\r
-    gbp.register.factory('GBPProNamedSelServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var ProviderNamedSelector = function(name, contract) {\r
-            this.name = name || null;\r
-            this.contract = contract || [];\r
-        };\r
-\r
-        var createBaseRestObj = function(pathObj) {\r
-            return GPBServices.createRestObj()\r
-                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId);\r
-        };\r
-\r
-        var createRestObj = function(pathObj) {\r
-            return createBaseRestObj(pathObj).one('provider-named-selector').one(pathObj.cnsId);\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            var data = null,\r
-                provderData = rawData['endpoint-group'][0]['provider-named-selector'];\r
-\r
-            if(provderData) {\r
-                data = provderData.map(function(elem) {\r
-                    if(elem.hasOwnProperty('contract') === false) {\r
-                        elem.contract = [];\r
-                    }\r
-                    return elem;\r
-                });\r
-            }\r
-\r
-            return data;\r
-        };\r
-\r
-        var createData = function(obj) {\r
-            var o = GPBServices.stripNullValues(obj);\r
-\r
-            if(o.contract) {\r
-                o.contract = GPBServices.removeEmptyElementsFromList(o.contract);\r
-            }\r
-\r
-            return { 'provider-named-selector' : [ o ] };\r
-        };\r
-\r
-        s.createPathObj = function(tenantId, epgId, cnsId) {\r
-            return {\r
-                tenantId: tenantId,\r
-                epgId: epgId,\r
-                cnsId: cnsId\r
-            };\r
-        };\r
-\r
-        s.createObj = function() {\r
-            return new ProviderNamedSelector();\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path),\r
-                reqData = createData(obj);\r
-\r
-            GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path);\r
-\r
-            GPBServices.delete(restObj, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = createBaseRestObj(path);\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPEndpointServices', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var Endpoint = function(tenantId) {\r
-            this.tenant = tenantId || null;\r
-            this['network-containment'] = null;\r
-            this['endpoint-group'] = null;\r
-            this['endpoint-groups'] = [];\r
-            this.condition = [];\r
-            this['l2-context'] = null;\r
-            this['mac-address'] = null;\r
-            this['l3-address'] = [];\r
-        };\r
-\r
-        var createRestObj = function() {\r
-            return GPBServices.createRestObj('operations');\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            return rawData.endpoints.endpoint;\r
-        };\r
-\r
-        var createBaseData = function(obj) {\r
-            var o = GPBServices.stripNullValues(obj);\r
-\r
-            if(o.condition) {\r
-                o.condition = GPBServices.removeEmptyElementsFromList(o.condition);\r
-            }\r
-\r
-            if(o['endpoint-groups']) {\r
-                o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);\r
-            }\r
-\r
-            if(o['l3-address']) {\r
-                o['l3-address'] = GPBServices.removeEmptyElementsFromList(o['l3-address']);\r
-            }\r
-\r
-            return o;\r
-        };\r
-\r
-        var createSendData = function(obj) {\r
-            var o = createBaseData(obj);\r
-            return { 'input': o };\r
-        };\r
-\r
-        var createDeleteData = function(obj) {\r
-            var o = { \r
-                'input': { \r
-                    'l3': obj['l3-address'],\r
-                    'l2': [\r
-                        { \r
-                            'l2-context': obj['l2-context'],\r
-                            'mac-address': obj['mac-address']\r
-                        }\r
-                    ] \r
-                } \r
-            };\r
-\r
-            return o;\r
-        };\r
-\r
-        s.createObj = function(tenantId) {\r
-            return new Endpoint(tenantId);\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj().one('endpoint:register-endpoint'),\r
-                reqData = createSendData(obj);\r
-\r
-            GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path).one('endpoint:unregister-endpoint'),\r
-                reqData = createDeleteData(obj);\r
-            GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('GBPEndpointL3Services', function(GPBServices) {\r
-\r
-        var s = {};\r
-\r
-        var EndpointL3 = function(tenantId) {\r
-            this.tenant = tenantId || null;\r
-            this['endpoint-group'] = null;\r
-            this['endpoint-groups'] = [];\r
-            this.condition = [];\r
-            this['l3-context'] = null;\r
-            this['ip-prefix'] = null;\r
-            this['endpoint-l2-gateways'] = [];\r
-            this['endpoint-l3-gateways'] = [];\r
-        };\r
-\r
-        var createRestObj = function() {\r
-            return GPBServices.createRestObj('operations');\r
-        };\r
-\r
-        var transformCallback = function(rawData) {\r
-            return rawData.endpoints['endpoint-l3-prefix'];\r
-        };\r
-\r
-        var createBaseData = function(obj) {\r
-            var o = GPBServices.stripNullValues(obj);\r
-\r
-            if(o.condition) {\r
-                o.condition = GPBServices.removeEmptyElementsFromList(o.condition);\r
-            }\r
-\r
-            if(o['endpoint-groups']) {\r
-                o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);\r
-            }\r
-\r
-            if(o['endpoint-l2-gateways']) {\r
-                o['endpoint-l2-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l2-gateways']);\r
-            }\r
-\r
-            if(o['endpoint-l3-gateways']) {\r
-                o['endpoint-l3-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l3-gateways']);\r
-            }\r
-\r
-            return o;\r
-        };\r
-\r
-        var createSendData = function(obj) {\r
-            var o = createBaseData(obj);\r
-            return { 'input': o };\r
-        };\r
-\r
-        var createDeleteData = function(obj) {\r
-            var o = { \r
-                'input': { \r
-                    'l3-prefix': [\r
-                        {\r
-                            'l3-context': obj['l3-context'],\r
-                            'ip-prefix': obj['ip-prefix']\r
-                        }\r
-                    ],\r
-                    'l2': obj['endpoint-l2-gateways'],\r
-                    'l3': obj['endpoint-l3-gateways']\r
-                } \r
-            };\r
-\r
-            return o;\r
-        };\r
-\r
-        s.createObj = function(tenantId) {\r
-            return new EndpointL3(tenantId);\r
-        };\r
-\r
-        s.send = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj().one('endpoint:register-l3-prefix-endpoint'),\r
-                reqData = createSendData(obj);\r
-\r
-            GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.delete = function(path, obj, successCbk, errorCbk) {\r
-            var restObj = createRestObj(path).one('endpoint:unregister-endpoint'),\r
-                reqData = createDeleteData(obj);\r
-\r
-            GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
-        };\r
-\r
-        s.load = function(path, successCbk, errorCbk) {\r
-            var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');\r
-\r
-            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
-        };\r
-\r
-        return s;\r
-\r
-    });\r
-\r
-    gbp.register.factory('PGNServices', function(GBPRestangular) {\r
-\r
-        var s = {};\r
-\r
-        var idGetter = {};\r
-\r
-        var idTypes = {\r
-            tenant: 'TENANT',\r
-            uuid: 'UUID',\r
-            l3ctx: 'L3CTX',\r
-            pathAction: 'PATHACTION',\r
-            accessAction: 'ACCESSACTION'\r
-        };\r
-\r
-        idGetter[idTypes.tenant] = function() {\r
-            return 1;\r
-        };\r
-\r
-        idGetter[idTypes.uuid] = function() {\r
-            return 2;\r
-        };\r
-\r
-        idGetter[idTypes.l3ctx] = function() {\r
-            return 3;\r
-        };\r
-\r
-        idGetter[idTypes.pathAction] = function() {\r
-            return 4;\r
-        };\r
-\r
-        idGetter[idTypes.accessAction] = function() {\r
-            return 5;\r
-        };\r
-\r
-        var getId = function(type) {\r
-            if(idGetter.hasOwnProperty(type)) {\r
-                return id = idGetter[type]();\r
-            } else {\r
-                throw "Cannot get idGetter for type " + type;\r
-            }\r
-        };\r
-\r
-        s.addReplaceEndpointGroup = function(successCbk, errorCbk, groupName, sgt, description) {\r
-            var tenantId = getId(idTypes.tenant),\r
-                uuid = getId(idTypes.uuid),\r
-                restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'pgn-application:create-or-replace-endpoint-groups',\r
-                reqData = {\r
-                               "input": \r
-                                {\r
-                                    "endpoint-group":[\r
-                                    {\r
-                                        "pgn-application:tenant-id": tenantID, \r
-                                        "pgn-application:id":uuid,\r
-                                        "pgn-application:security-group-tag":sgt,\r
-                                        "pgn-application:name":groupName,\r
-                                        "pgn-application:description":description\r
-                                    }\r
-                                ]\r
-                            }\r
-                        };\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.deleteEndpointGroup = function(successCbk, errorCbk, uuid) {\r
-            var tenantId = getId(idTypes.tenant),\r
-                restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'pgn-application:delete-endpoint-groups',\r
-                reqData = {\r
-                            "input": {\r
-                                "endpoint-group":[\r
-                                    {\r
-                                        "pgn-application:tenant-id": tenantId, \r
-                                        "pgn-application:id":uuid\r
-                                    }\r
-                                ]\r
-                            }\r
-                        };\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.getActions = function(successCbk, errorCbk) {\r
-            var tenantId = getId(idTypes.tenant),\r
-                pathActionId = getId(idTypes.pathAction),\r
-                accessActionId = getId(idTypes.accessAction),\r
-                restObj = GBPRestangular.one('restconf').one('config').one('policy:tenants',  tenantId).one('subject-feature-instances');\r
-\r
-            restObj.get().then(function(data) {\r
-                successCbk(data); //TODO fill actions\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.applyPolicy = function(successCbk, errorCbk, providerId, consumerId, pathSelRule, accessCtrlRule) {\r
-            var restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'pgn-application:wire-endpoint-groups',\r
-                actionRefName = (pathSelRule ? pathSelRule : '') + (accessCtrlRule ? accessCtrlRule : ''),\r
-                reqData = {\r
-                               "input": {\r
-                                    "endpoint-group-pair-with-rules": {\r
-                                        "pgn-application:provider-tenant-id": tenantID, \r
-                                        "pgn-application:consumer-tenant-id": tenantID, \r
-                                        "pgn-application:provider-group-id":providerId,\r
-                                        "pgn-application:consumer-group-id":consumerId,\r
-                                        "pgn-application:group-rule": [\r
-                                            {\r
-                                                "action-ref": [pathSelRule, accessCtrlRule].map(function(r) {\r
-                                                    return { "name":r };\r
-                                                }),\r
-                                                "name":actionRefName\r
-                                            }\r
-                                        ]\r
-                                    }\r
-                                }\r
-                            };\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                successCbk(data); //TODO reload policies\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.deletePolicy = function(successCbk, errorCbk, providerId, consumerId) {\r
-            var tenantId = getId(idTypes.tenant),\r
-                restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'pgn-application:unwire-endpoint-groups',\r
-                reqData = {\r
-                           "input": \r
-                            {\r
-                                "endpoint-group-pair":[\r
-                                    {\r
-                                        "pgn-application:provider-tenant-id": tenantId, \r
-                                        "pgn-application:consumer-tenant-id": tenantId, \r
-                                        "pgn-application:provider-group-id":providerId,\r
-                                        "pgn-application:consumer-group-id":consumerId\r
-                                    }\r
-                                ]\r
-                            }\r
-                        };\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                successCbk(data); //TODO reload policies\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.addEndPoint = function(successCbk, errorCbk, ipAddress, groupId) {\r
-            var l3ctxId = getId(idTypes.l3ctx),\r
-                tenantId = getId(idTypes.tenant),\r
-                restObj = GBPRestangular.one('restconf').one('operations'),\r
-                rpcRes = 'endpoint:register-endpoint',\r
-                reqData = {\r
-                            "input": {\r
-                                "endpoint-group": groupId,\r
-                                "l3-address": [\r
-                                    {\r
-                                        "ip-address": ipAddress,\r
-                                        "l3-context": l3ctxId\r
-                                    }\r
-                                ],\r
-                                "tenant": tenantId\r
-                            }\r
-                        };\r
-\r
-            restObj.post(rpcRes, reqData).then(function(data) {\r
-                successCbk(data);\r
-            }, function(res) {\r
-                errorCbk(res);\r
-            });\r
-        };\r
-\r
-        s.getUUIDnumber = function() {\r
-            var d = new Date().getTime();\r
-            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r
-                        var r = (d + Math.random()*16)%16 | 0;\r
-                        d = Math.floor(d/16);\r
-                        return (c=='x' ? r : (r&0x3|0x8)).toString(16);\r
-                    });\r
-        };\r
-\r
-        return s;\r
-    });\r
-\r
-    gbp.register.factory('DesignGbpFactory', function(){\r
-\r
-        var dvf = {};\r
-\r
-        dvf.setMainClass = function(){\r
-            if ( $('.gbpWrapper').length ) {\r
-                $('.gbpWrapper').closest('.col-xs-12').addClass('gbpGlobalWrapper');\r
-              }\r
-        };\r
-\r
-        return dvf;\r
-\r
-    });\r
-\r
-    gbp.register.factory('JointGraphOffsetFactory', function(GBPConstants){\r
-        var jgof = {};\r
-\r
-        jgof.createWHObj = function(w, h) {\r
-            return {w: w || 0, h: h || 0};\r
-        };\r
-\r
-        jgof.updateOffsets = function(delta, offset, margin, maximums, paper) {\r
-            offset.w = offset.w + delta.w + margin.w;\r
-\r
-            if(offset.w >= maximums.w) {\r
-                paper.setDimensions(offset.w + 30, paper.options.height);\r
-                offset.w = offset.ow;\r
-                offset.h = offset.h + margin.h;\r
-            }\r
-\r
-        };\r
-\r
-        jgof.resetOffsets = function(offset, w, h) {\r
-            offset.w = w;\r
-            offset.h = h;\r
-        };\r
-\r
-        jgof.getCurrentOffset = function(array, type) {\r
-            var max = 0;\r
-            array.forEach(function(item){\r
-                max = item.attributes.position[type] > max ? item.attributes.position[type] : max;\r
-            });\r
-\r
-            return max;\r
-        };\r
-\r
-        jgof.checkObjsHoffsets = function(array, size, paper) {\r
-            var lastPosY = 0,\r
-                addOffset = false,\r
-                cellBottomOffset = 80,\r
-                setItemPosition = function(item, type) {\r
-                    while (item.attributes.position[type] < size + cellBottomOffset) {\r
-                        item.translate(null, cellBottomOffset);\r
-                    }\r
-                };\r
-\r
-            array.forEach(function(item){\r
-                addOffset = (size + cellBottomOffset) >= item.attributes.position.y;\r
-\r
-                if ( addOffset ) {\r
-                    setItemPosition(item, 'y');\r
-                }\r
-\r
-                if ( item.attributes.position.y + cellBottomOffset > paper.options.height ) {\r
-                    paper.setDimensions(paper.options.width, paper.options.height + cellBottomOffset);\r
-                }\r
-            });\r
-        };\r
-\r
-        return jgof;\r
-    });\r
-\r
-    gbp.register.factory('JointGraphFactory', function(GBPConstants){\r
-        var defaulColor = 'blue';\r
-\r
-        var jgf = {};\r
-\r
-        jgf.getLabelLength = function(length) {\r
-            return length * 10 > 200 ? 200 : length * 10;\r
-        };\r
-\r
-        jgf.createGraph = function() {\r
-            var graph = new joint.dia.Graph();\r
-\r
-            var paper = new joint.dia.Paper({\r
-                el: $('#graph'),\r
-                width: 1300,\r
-                height: 650,\r
-                model: graph,\r
-                gridSize: 1,\r
-                interactive: { vertexAdd: false }\r
-            });\r
-\r
-            return paper;\r
-        };\r
-\r
-        jgf.resetGraphDimension = function(paper, element, paddingT, paddingL){\r
-            paddingT = paddingT ? paddingT : 0;\r
-            paddingL = paddingL ? paddingL : paddingT;\r
-\r
-            var paperWidth = element.width() - paddingL,\r
-                paperHeight = element.height() - paddingT - 5;\r
-\r
-            paper.setDimensions(paperWidth, paperHeight);\r
-        };\r
-\r
-        jgf.reloadGraph = function(graph) {\r
-            graph.clear();\r
-        };\r
-\r
-        jgf.createElement = function(elementName, posx, posy, width, height, objectType, object, tooltip, bgcolor, titleName) {\r
-            var setWidth = function(width) {\r
-                return width < GBPConstants.jointElements.minWidth ? GBPConstants.jointElements.minWidth : \r
-                       width > GBPConstants.jointElements.maxWidth ? GBPConstants.jointElements.maxWidth : width;\r
-            };\r
-\r
-            var setHeight = function(height) {\r
-                return height < GBPConstants.jointElements.minHeight ? GBPConstants.jointElements.minHeight : \r
-                       height > GBPConstants.jointElements.maxHeight ? GBPConstants.jointElements.maxHeight : height;\r
-            };\r
-\r
-            // joint.shapes.basic.Rect = joint.shapes.basic.Generic.extend({\r
-            joint.shapes.html = {};\r
-            joint.shapes.html.Element = joint.shapes.basic.Generic.extend({\r
-\r
-                markup: '<g class="rotatable"><g class="scalable"><rect/><title /></g><text class="text1"></text><text class="text2"></text><title /></g>',\r
-                \r
-                defaults: joint.util.deepSupplement({\r
-                    type: 'html.Element',\r
-                    attrs: {\r
-                        'rect': { fill: bgcolor, stroke: 'black', 'follow-scale': true, width: 80, height: 40, cursor: 'pointer' },\r
-                        '.text1': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.3, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer', 'font-weight' : 'bold'},\r
-                        '.text2': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.7, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer'},\r
-                        'title': {text: tooltip},\r
-                    }\r
-                    \r
-                }, joint.shapes.basic.Generic.prototype.defaults)\r
-            });\r
-\r
-            // joint.shapes.html.ElementView = joint.dia.ElementView.extend({\r
-\r
-            //     template: [\r
-            //         '<input class="html-element" type="text" value="'+elementName+'"/>',\r
-            //         ''\r
-            //     ].join(''),\r
-\r
-            //     initialize: function() {\r
-            //         _.bindAll(this, 'updateBox');\r
-            //         joint.dia.ElementView.prototype.initialize.apply(this, arguments);\r
-\r
-            //         this.$box = $(_.template(this.template)());\r
-            //         // Prevent paper from handling pointerdown.\r
-            //         this.$box.find('input,select').on('mousedown click', function(evt) { evt.stopPropagation(); });\r
-            //         // This is an example of reacting on the input change and storing the input data in the cell model.\r
-            //         this.$box.find('input').on('change', _.bind(function(evt) {\r
-            //             this.model.set('input', $(evt.target).val());\r
-            //         }, this));\r
-            //         this.$box.find('button').on('click', _.bind(function(evt) {\r
-            //             this.model.set('button', $('.divc').css('display','block'));\r
-            //         }, this));\r
-            //         // Update the box position whenever the underlying model changes.\r
-            //         this.model.on('change', this.updateBox, this);\r
-\r
-            //         this.updateBox();\r
-            //     },\r
-            //     render: function() {\r
-            //         joint.dia.ElementView.prototype.render.apply(this, arguments);\r
-            //         this.paper.$el.prepend(this.$box);\r
-            //         this.updateBox();\r
-            //         return this;\r
-            //     },\r
-            //     updateBox: function() {\r
-            //         // Set the position and dimension of the box so that it covers the JointJS element.\r
-            //         var bbox = this.model.getBBox();\r
-            //         // Example of updating the HTML with a data stored in the cell model.\r
-            //         this.$box.css({ width: bbox.width, height: bbox.height, left: bbox.x, top: bbox.y, transform: 'rotate(' + (this.model.get('angle') || 0) + 'deg)' });\r
-            //     },\r
-            //     removeBox: function(evt) {\r
-            //         this.$box.remove();\r
-            //     }\r
-            // });\r
-\r
-            elementName = elementName.length > 20 ? elementName.slice(0,20) + '...' : elementName;\r
-            // width = width > 200 ? 200 : width;\r
-\r
-            // return new joint.shapes.basic.Rect({\r
-            return new joint.shapes.html.Element({\r
-                position: { x: posx || 0, y: posy || 0 },\r
-                size: { width: width ||  GBPConstants.jointElements.minWidth, height: height || GBPConstants.jointElements.minHeight },\r
-                attrs: { rect: { fill: bgcolor }, '.text1': { fill: 'black', text: titleName}, '.text2': { fill: 'black', text: elementName }},\r
-                objType: objectType,\r
-                objData: object\r
-            });\r
-        };\r
-\r
-        jgf.transformElement = function(element, transformX, transformY) {\r
-            return element.translate(transformX, transformY);\r
-        };\r
-\r
-        jgf.addItem = function(graph, item) {\r
-            graph.addCells([item]);\r
-        };\r
-\r
-        jgf.addItemList = function(graph, listItem) {\r
-            graph.addCells(listItem);\r
-        };\r
-\r
-        jgf.createLink = function(srcId, targetId, colorIn, colorOut, direction, objData) {\r
-            colorIn = colorIn || defaulColor;\r
-            colorOut = colorOut || defaulColor;\r
-\r
-            var labelTextColor = GBPConstants.colors[GBPConstants.strings.sigmaTopoDefaultText],\r
-                labelBckColor = GBPConstants.colors[GBPConstants.strings.linklabel];\r
-\r
-            var linkObj = {\r
-                source: { id: srcId },\r
-                target: { id: targetId },\r
-                attrs: {\r
-                    '.connection': { stroke: colorIn, 'stroke-width': 2, name: 'normal' },\r
-                    '.connection-wrap': { 'stroke-width': 10 } \r
-                },\r
-                objData: objData\r
-            };\r
-\r
-            if(direction === 'in' || direction == 'bidirectional' || direction === undefined || direction === null) {\r
-                linkObj.attrs['.marker-target'] = { fill: colorIn, d: 'M 10 0 L 0 5 L 10 10 z' };\r
-            }\r
-\r
-            if(direction === 'out' || direction == 'bidirectional') {\r
-                linkObj.attrs['.marker-source'] = { fill: colorOut, d: 'M 10 0 L 0 5 L 10 10 z' };\r
-            }\r
-\r
-            var link = new joint.dia.Link(linkObj);\r
-\r
-            // if(labelText) {\r
-            //     link.label(0, { position: 0.3, attrs: { text: { text: labelText, fill: labelTextColor }, rect: { stroke: labelBckColor, 'stroke-width': 20 }}});\r
-            // }\r
-\r
-\r
-            return link;\r
-        };\r
-\r
-        return jgf;\r
-    });\r
-\r
-    gbp.register.factory('GBPJointGraphBuilder', function(GBPRestangular, GBPConstants, JointGraphFactory, JointGraphOffsetFactory, TopologyDataLoaders){\r
-        var jgb = {};\r
-\r
-        var builders = {};\r
-\r
-        var buildJointData = function(paper, nodes, links) {\r
-\r
-        };\r
-\r
-        var setOperConfigTopoData = function(paper, data){\r
-            var topo = TopologyDataLoaders.getEpgTopo(data);\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
-                    epg: []\r
-                },\r
-                linksArray = [];\r
-\r
-            JointGraphFactory.resetGraphDimension(paper, $('.policyGraphWrapper'));\r
-            JointGraphFactory.reloadGraph(paper.model);\r
-\r
-            var deg2rad = function(deg){\r
-                return deg * Math.PI / 180;\r
-            };\r
-\r
-            var getXYInCircle = function(elementIndex, elementsCount, paperCenterX, paperCenterY, elementWidth, elementHeight){\r
-                var result = {x:0, y:0};\r
-                    circleMargin = 100;\r
-                    r = (paperCenterX < paperCenterY ? paperCenterX : paperCenterY ) - circleMargin;\r
-                    degs = 360 / elementsCount * (elementIndex+1) + 180;\r
-                    rads = deg2rad(degs);\r
-                \r
-                elementWidth = elementWidth ? elementWidth : GBPConstants.jointElements.minWidth;\r
-                elementHeight = elementHeight ? elementHeight : GBPConstants.jointElements.minHeight;\r
-                \r
-                if(elementWidth < GBPConstants.jointElements.minWidth){elementWidth = GBPConstants.jointElements.minWidth;}\r
-                if(elementWidth > GBPConstants.jointElements.maxWidth){elementWidth = GBPConstants.jointElements.maxWidth;}\r
-                if(elementHeight < GBPConstants.jointElements.minHeight){elementHeight = GBPConstants.jointElements.minHeight;}\r
-                if(elementHeight > GBPConstants.jointElements.maxHeight){elementHeight = GBPConstants.jointElements.maxHeight;}\r
-                    \r
-                result.x = paperCenterX + r * Math.cos(rads);\r
-                result.y = paperCenterY + r * Math.sin(rads);\r
-                \r
-                degs = degs % 360;\r
-                if(degs > 90 && degs < 270){\r
-                    result.x = result.x - elementWidth;\r
-                }\r
-                if(degs == 90 || degs == 270){\r
-                    result.x = result.x - elementWidth / 2;\r
-                }\r
-                if(degs > 180 && degs < 360){\r
-                    result.y = result.y - elementHeight;\r
-                }\r
-                if(degs === 0 || degs == 180){\r
-                    result.y = result.y - elementHeight / 2;\r
-                }\r
-                return result;\r
-            };\r
-            \r
-            var paperCenterX = (paper.options.width) / 2;\r
-            var paperCenterY = (paper.options.height) / 2;\r
-            topo.nodes.forEach(function(i, index){\r
-                var label = i.label,\r
-                    header = 'Epg',\r
-                    width =  Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)),\r
-                    color = GBPConstants.colors[GBPConstants.strings.epg];\r
-                    \r
-                var itemPos = getXYInCircle(index, topo.nodes.length, paperCenterX, paperCenterY, width, null);\r
-                var item = JointGraphFactory.createElement(label, itemPos.x, itemPos.y, width, null, GBPConstants.strings.epg , i, label, color, header);\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
-            });\r
-\r
-            var getItemById = function(id, array){\r
-                var item = array.filter(function(i){\r
-                    return i.attributes.objData.id === id;\r
-                });\r
-\r
-                return item.length ? item[0] : null;\r
-            };\r
-\r
-            topo.links.forEach(function(l){\r
-                var sourceItem = getItemById(l.source, itemsArray.epg),\r
-                    targetItem = getItemById(l.target, itemsArray.epg);\r
-\r
-                if (sourceItem && targetItem) {\r
-                    var link = JointGraphFactory.createLink(sourceItem.id, targetItem.id, 'blue', 'green', l.direction, l.data);\r
-                    linksArray.push(link);\r
-                }\r
-            });\r
-\r
-            JointGraphFactory.addItemList(paper.model, linksArray);\r
-        };\r
-\r
-        jgb.loadTopology = function(args, paper, type) {\r
-            if(type === null || builders.hasOwnProperty(type) === false) {\r
-                type = GBPConstants.strings.empty;\r
-            }\r
-\r
-            builders[type](args, paper);\r
-        };\r
-\r
-        builders[GBPConstants.strings.empty] = function(args, paper) {\r
-            JointGraphFactory.reloadGraph(paper.model);\r
-        };\r
-\r
-        builders[GBPConstants.strings.config] = function(args, paper) {\r
-            var storage = args.storage || 'config',\r
-                tenantId = args.tenantId;\r
-                \r
-       \r
-            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){\r
-                setOperConfigTopoData(paper, data);\r
-            }, function(){});\r
-        };\r
-\r
-        builders[GBPConstants.strings.oper] = function(args, paper) {\r
-            var storage = args.storage || 'config',\r
-                tenantId = args.tenantId;\r
-\r
-            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){\r
-                setOperConfigTopoData(paper, data);\r
-            }, function(){});\r
-        };\r
-\r
-        builders[GBPConstants.strings.l2l3] = function(args, paper) {\r
-            var storage = args.storage || 'config',\r
-                tenantId = args.tenantId;\r
-\r
-            if(storage && tenantId) {\r
-                restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId);\r
-\r
-                restObj.get().then(function(data) {\r
-                    var createLinks = function(srcList, srcItems, dstItems) {\r
-                        var linkItems = srcList.map(function(srcObj) {\r
-                            var linkItem = null;\r
-                            if(srcObj.parent && dstItems[srcObj.parent]) {\r
-                                linkItem = JointGraphFactory.createLink(srcItems[srcObj.id].id, dstItems[srcObj.parent].id, 'blue');\r
-                            }\r
-                            return linkItem;\r
-                        }).filter(function(linkObj) {\r
-                            return linkObj !== null;\r
-                        });\r
-\r
-                        return linkItems;\r
-                    };\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
-                    itemsArray = {\r
-                        l3: {},\r
-                        l2bridge: {},\r
-                        l2flood: {},\r
-                        subnets: {}\r
-                    };\r
-\r
-                    JointGraphFactory.reloadGraph(paper.model);\r
-\r
-                    data.tenant[0]['l3-context'].forEach(function(c, i) {\r
-                        var label = c.name || c.id,\r
-                            header = 'L3 context',\r
-                            color = GBPConstants.colors[GBPConstants.strings.l3ctx],\r
-                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));\r
-                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.l3ctx , c, null, color, header);\r
-\r
-                        itemsArray.l3[c.id] = 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
-                    });\r
-\r
-                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100);\r
-\r
-                    data.tenant[0]['l2-bridge-domain'].forEach(function(c, i) {\r
-                        var label = c.name || c.id,\r
-                            header = 'L2 bridge domain',\r
-                            color = GBPConstants.colors[GBPConstants.strings.bridge],\r
-                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));\r
-                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.bridge , c, null, color, header);\r
-\r
-                        itemsArray.l2bridge[c.id] = 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
-                    });\r
-\r
-                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100);\r
-\r
-                    data.tenant[0]['l2-flood-domain'].forEach(function(c, i) {\r
-                        var label = c.name || c.id,\r
-                            header = 'L2 flood domain',\r
-                            color = GBPConstants.colors[GBPConstants.strings.flood],\r
-                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));\r
-                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.flood , c, null, color, header);\r
-\r
-                        itemsArray.l2flood[c.id] = 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
-                    });\r
-\r
-                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100);\r
-\r
-                    data.tenant[0]['subnet'].forEach(function(c, i) {\r
-                        var label = c.name || c.id,\r
-                            header = 'Subnet',\r
-                            color = GBPConstants.colors[GBPConstants.strings.subnet],\r
-                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));\r
-                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.subnet , c, null, color, header);\r
-\r
-                        itemsArray.subnets[c.id] = 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
-                    });\r
-\r
-                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.oh);\r
-\r
-                    var l2bridgeL3 = createLinks(data.tenant[0]['l2-bridge-domain'], itemsArray.l2bridge, itemsArray.l3);\r
-                    JointGraphFactory.addItemList(paper.model, l2bridgeL3);\r
-\r
-                    var l2floodL2bridge = createLinks(data.tenant[0]['l2-flood-domain'], itemsArray.l2flood, itemsArray.l2bridge);\r
-                    JointGraphFactory.addItemList(paper.model, l2floodL2bridge);\r
-\r
-                    var l2floodSubnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l2flood);\r
-                    JointGraphFactory.addItemList(paper.model, l2floodSubnet);\r
-\r
-                    var l2bridgeSubnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l2bridge);\r
-                    JointGraphFactory.addItemList(paper.model, l2bridgeSubnet);\r
-\r
-                    var l3Subnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l3);\r
-                    JointGraphFactory.addItemList(paper.model, l3Subnet);\r
-\r
-                }, function() {\r
-\r
-                });\r
-            }\r
-        };\r
-\r
-\r
-        return jgb;\r
-    });\r
+define(['app/gbp/gbp.module', 'app/gbp/js/joint.clean.build'], function(gbp, joint) {
+
+    gbp.register.factory('GBPRestangular', function(Restangular, ENV) {
+        return Restangular.withConfig(function(RestangularConfig) {
+            RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL"));
+        });
+    });
+
+    gbp.register.factory('GBPConstants', function() {
+        var c = { colors: {'graph' : {}}, strings: {}, jointElements: {}, objType: {}, numbers: {}};
+
+        c.strings.flood = 'flood';
+        c.strings.bridge = 'bridge';
+        c.strings.l3ctx = 'l3ctx';
+        c.strings.subnet = 'subnet';
+        c.strings.linklabel = 'linklabel';
+        c.strings.in = 'in';
+        c.strings.out = 'out';
+        c.strings.bi = 'bidirectional';
+
+        c.strings.config = 'CONFIG';
+        c.strings.oper = 'OPERATIONAL';
+        c.strings.l2l3 = 'L2L3';
+        c.strings.mock = 'MOCK';
+        c.strings.sigmaTopoDefaultText = 'SIGMATOPODEFAULTTEXT';
+        c.strings.sigmaTopoDefault = 'SIGMATOPODEFAULTTEXT';
+
+        c.colors[c.strings.flood] = '#DF0101';
+        c.colors[c.strings.bridge] = '#0080FF';
+        c.colors[c.strings.l3ctx] = '#3ADF00';
+        c.colors[c.strings.subnet] = '#FF9933';
+        c.colors[c.strings.sigmaTopoDefaultText] = '#fff';
+        c.colors[c.strings.epg] = '#8fde70';
+        c.colors[c.strings.linklabel] = '#3366CC';
+
+        c.colors[c.strings.flood+'-'+c.strings.bridge] = '#6666FF';
+        c.colors[c.strings.bridge+'-'+c.strings.l3ctx] = '#6666FF';
+
+        c.colors[c.strings.subnet+'-'] = '#6666FF';
+
+        c.colors['graph']['subject'] = '#FFFFD4';
+        c.colors['graph']['cns'] = '#8EEDFF';
+        c.colors['graph']['pns'] = '#FF9C9C';
+
+        c.jointElements.minWidth = 100;
+        c.jointElements.maxWidth = 300;
+        c.jointElements.minHeight = 50;
+        c.jointElements.maxHeight = 300;
+
+        c.objType.contract = 'contract';
+        c.objType.epg = 'epg';
+        c.objType.consumer = 'consumer';
+        c.objType.provider = 'provider';
+        c.objType.subject = 'subject';
+        c.objType.rule = 'rule';
+
+        c.numbers.displayLabelLength = 40;
+
+        return c;
+    });
+
+    gbp.register.factory('MockServices', function() {
+
+        var ms = {};
+
+        ms.mockTopoData = function() {
+            var lid = 0,
+                nodeRaw = [0, 1, 2, 3],
+                linkRaw = [[0, 1], [2, 3], [3, 0], [0, 3]],
+                nodes = nodeRaw.map(function(data) {
+                    return {
+                                'id': 'n' + data,
+                                'label': 'LABEL'+data,
+                                'size': 3,
+                                'x': Math.random(),
+                                'y': Math.random(),
+                                'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
+                            };
+                }),
+                links = linkRaw.map(function(data) {
+                    var obj = {
+                                id: 'e' + lid,
+                                source: 'n' + data[0],
+                                target: 'n' + data[1],
+                                color: GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
+                            };
+                    lid = lid + 1;
+                    return obj;
+                });
+
+            return {nodes: nodes, links: links};
+        };
+
+        return ms;
+    });
+
+    gbp.register.factory('TopologyDataLoaders', function(GBPRestangular, GBPConstants) {
+        var tdl = {};
+
+        tdl.getSubjectsBetweenEndpointGroups = function(storage, tenantId, successCbk, errorCbk) {
+            var restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'ui-backend:get-subjects-between-endpoint-groups',
+                reqData = { "input": { "tenant-id": tenantId }};
+
+            if(storage) {
+                reqData.input['from-oper-data'] = {};
+            }
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                // console.info('got data', data.output);
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        //Policies are representing links in PGN topology
+        tdl.getGroupRulesBetweenEndpointGroups = function(successCbk, errorCbk) {
+            var restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'pgn-application:get-group-rules-between-endpoint-groups',
+                reqData = { "input": { "endpoint-group-pair":[] }};
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                successCbk(data); //set topology links
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        //Groups are representing nodes in PGN topology
+        tdl.getEndpointGroups = function(successCbk, errorCbk) {
+            var tenantId = getId(idTypes.tenant),
+                restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'pgn-application:get-endpoint-groups',
+                reqData = {
+                            "input": {
+                                "endpoint-group-id":[
+                                    {
+                                        "pgn-application:tenant-id": tenantId
+                                    }
+                                ]
+                            }
+                        };
+
+          restObj.post(rpcRes, reqData).then(function(data) {
+              successCbk(data); //set topology nodes
+          }, function(res) {
+              errorCbk(res);
+          });
+
+        };
+
+        tdl.getEndpointsFromEndpointGroup = function(tenantId, epgId, successCbk, errorCbk) {
+            var restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'ui-backend:get-endpoints-from-endpoint-group',
+                reqData = {
+                            "input": {
+                                "tenant-id": tenantId,
+                                "endpoint-group-id":epgId
+                            }
+                        };
+
+          restObj.post(rpcRes, reqData).then(function(data) {
+              successCbk(data); //set topology nodes
+          }, function(res) {
+              errorCbk(res);
+          });
+
+        };
+
+        tdl.getEpgTopo = function(data){
+            var epgData = data.output['endpoint-group-pair-with-subject'],
+                nodes = [],
+                edges = [],
+                setNode = function(obj){
+                    var nodeObj = {
+                            'id': 'n' + nodes.length,
+                            'label': obj.name || obj.id,
+                            'name': obj.name,
+                            'size': 1,
+                            'x': Math.random(),
+                            'y': Math.random(),
+                            'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault],
+                            'type': obj.type
+                        };
+
+                    nodes.push(nodeObj);
+                    return nodeObj.id;
+                },
+                setEdge = function(sourceId, destId, data, direction) {
+                    var obj = {
+                            'id': 'e' + edges.length,
+                            'source': sourceId,
+                            'target': destId,
+                            'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault],
+                            'data': data,
+                            'direction' : direction
+                            // 'type': 'curve',
+                            // 'size' : 100
+                        };
+
+                    edges.push(obj);
+                },
+                getObjByProp = function(val, prop, list) {
+                    return list.filter(function(i){
+                        return i[prop] === val;
+                    });
+                },
+                getDirection = function(subjects){
+                    var directions = [];
+                    if ( subjects ) {
+                        subjects.forEach(function(s){
+                            if ( s['ui-rule'] ) {
+                                s['ui-rule'].forEach(function(rule){
+                                    if ( rule['classifier-ref'] ) {
+                                        rule['classifier-ref'].forEach(function(classifier){
+                                            if ( classifier.direction && directions.indexOf(classifier.direction) === -1 ){
+                                                directions.push(classifier.direction);
+                                            }
+                                        });
+                                    }
+                                });
+                            }
+                        });
+                    }
+                    return directions.length === 1 ? directions[0] : directions.length > 1 ? 'bidirectional' : null;
+
+                };
+
+            if(epgData) {
+                epgData.forEach(function(e){
+                    var cepgnId = null,
+                        pepgnId = null;
+
+                    if ( !getObjByProp(e['consumer-endpoint-group-id'],'name', nodes).length ) {
+                        var objCepg = {
+                            type: 'epg',
+                            name: e['consumer-endpoint-group-id']
+                        };
+                        cepgnId = setNode(objCepg);
+                    } else {
+                        cepgnId = getObjByProp(e['consumer-endpoint-group-id'],'name', nodes)[0].id;
+                    }
+                    if ( !getObjByProp(e['provider-endpoint-group-id'],'name', nodes).length ) {
+                        var objPepg = {
+                            type: 'epg',
+                            name: e['provider-endpoint-group-id']
+                        };
+                        pepgnId = setNode(objPepg);
+                    } else {
+                        pepgnId = getObjByProp(e['provider-endpoint-group-id'],'name', nodes)[0].id;
+                    }
+
+                    var direction = getDirection(e['ui-subject']);
+
+                    if ( cepgnId && pepgnId ) {
+                        setEdge(cepgnId, pepgnId, e['ui-subject'], direction);
+                    }
+                });
+            }
+
+            return {
+                nodes: nodes,
+                links: edges
+            };
+        };
+
+        
+        tdl.getL2L3 = function(storage, tenantId, successCbk, errorCbk) {
+            //l2-bridge-domain
+            var lid = 0,
+                nid = 0,
+                getL2L3Label = function(node) {
+                    return node.name || node.id;
+                },
+                getSubnetLabel = function(node) {
+                    return node['ip-prefix'] || node.id;
+                },
+                getNodeColor = function(src) {
+                    return GBPConstants.colors[src] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];
+                },
+                getLinkColor = function(from, to) {
+                    return GBPConstants.colors[from+'-'+to] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];
+                },
+                getNodes = function(data, srcDesc, getLabelCbk) {
+                    var nodes = data.map(function(elem) {
+                        var obj = {
+                            'id': 'n' + nid,
+                            'label': getLabelCbk(elem),
+                            'uuid': elem.id,
+                            'size': 3,
+                            'x': Math.random(),
+                            'y': Math.random(),
+                            'color': getNodeColor(srcDesc),
+                            'elemType': srcDesc
+                        };
+
+                        nid += 1;
+                        return obj;
+                    });
+
+                    return nodes;
+                },
+                getLinks = function(data, srcNodes, targetNodes, fromDesc, toDesc) {
+                    var findByUUID = function(array, uuid) {
+                        return array.filter(function(elem) {
+                            return elem.uuid === uuid;
+                        })[0];
+                    };
+
+                    var links = data.map(function(elem) {
+                        var obj = null,
+                            src = findByUUID(srcNodes, elem.id),
+                            trg = findByUUID(targetNodes, elem.parent);
+
+                        if(src && trg) {
+                            obj = {
+                                'id': 'e' + lid,
+                                'source': src.id,
+                                'target': trg.id,
+                                'color': getLinkColor(fromDesc, toDesc)
+                            };
+                            lid += 1;
+                        }
+
+                        return obj;
+                    }).filter(function(elem) {
+                        return elem !== null;
+                    });
+
+                    return links;
+                };
+
+            restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId);
+
+            restObj.get().then(function(data) {
+                var l2FloodNodes = getNodes(data.tenant[0]['l2-flood-domain'] || [], GBPConstants.strings.flood, getL2L3Label),
+                    l2BridgeNodes = getNodes(data.tenant[0]['l2-bridge-domain'] || [], GBPConstants.strings.bridge, getL2L3Label),
+                    l3ContextNodes = getNodes(data.tenant[0]['l3-context'] || [], GBPConstants.strings.l3ctx, getL2L3Label),
+                    subnetNodes = getNodes(data.tenant[0]['subnet'] || [], GBPConstants.strings.subnet, getSubnetLabel),
+                    l2FloodLinks = getLinks(data.tenant[0]['l2-flood-domain'] || [], l2FloodNodes, l2BridgeNodes, GBPConstants.strings.flood, GBPConstants.strings.bridge),
+                    l2BridgeLinks = getLinks(data.tenant[0]['l2-bridge-domain'] || [], l2BridgeNodes, l3ContextNodes, GBPConstants.strings.bridge, GBPConstants.strings.l3ctx),
+                    subnetLinks = getLinks(data.tenant[0]['subnet'] || [], subnetNodes, l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes), GBPConstants.strings.subnet, ''),
+                    allNodes = l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes).concat(subnetNodes),
+                    allLinks = l2BridgeLinks.concat(l2FloodLinks).concat(subnetLinks);
+
+                successCbk(allNodes, allLinks);
+            }, function(res) {
+                errorCbk(res.data, res.status);
+            });
+        };
+
+        tdl.getClassifierInstances = function() {
+
+        };
+
+        return tdl;
+    });
+
+    gbp.register.factory('TopoServices', function(TopologyDataLoaders, MockServices, GBPConstants) {
+
+        var ts = {};
+
+        var loaders = {};
+
+        var legends = {};
+
+        var transformPGNTopoNodes = function(data) {
+            return data.output['endpoint-group'].map(function(d) {
+                return {
+                    id: d.id,
+                    group: d.name,
+                    sgt: d['security-group-tag']
+                };
+            });
+        };
+
+        var transformPGNTopoLinks = function(data) {
+            return data.output['endpoint-group-pair-with-rules'].map(function(d) {
+                return {
+                    source: d['provider-group-id'],
+                    target: d['consumer-group-id'],
+                    policy: d['group-rule'][0]['action-ref'].map(function(r) {
+                        return r.name;
+                    })
+                };
+            });
+        };
+
+        var gbpLegend = {
+            'epg' : GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
+        };
+
+        legends[GBPConstants.strings.empty] = {};
+        legends[GBPConstants.strings.config] = gbpLegend;
+        legends[GBPConstants.strings.oper] = gbpLegend;
+        legends[GBPConstants.strings.mock] = gbpLegend;
+        legends[GBPConstants.strings.l2l3] = {
+            'l2-flood': GBPConstants.colors[GBPConstants.strings.flood],
+            'l2-bridge': GBPConstants.colors[GBPConstants.strings.bridge],
+            'l3-context': GBPConstants.colors[GBPConstants.strings.l3ctx],
+            'subnet': GBPConstants.colors[GBPConstants.strings.subnet],
+            'link': GBPConstants.colors[GBPConstants.strings.subnet+'-']
+        };
+
+        loaders[GBPConstants.strings.empty] = function(successCbk, errorCbk) {
+            successCbk([], []);
+        };
+
+        loaders[GBPConstants.strings.config] = function(successCbk, errorCbk, args) {
+            var storage = args.storage || 'config',
+                tenantId = args.tenantId;
+                
+       
+            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){
+                var topo = TopologyDataLoaders.getEpgTopo(data);
+                successCbk(topo.nodes, topo.links);
+                //successCbk
+            }, errorCbk);
+        };
+
+        loaders[GBPConstants.strings.oper] = function(successCbk, errorCbk, args) {
+            var storage = args.storage || 'config',
+                tenantId = args.tenantId;
+
+            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){
+                var topo = TopologyDataLoaders.getEpgTopo(data);
+                successCbk(topo.nodes, topo.links);
+                //successCbk
+            }, errorCbk);
+        };
+
+        loaders[GBPConstants.strings.l2l3] = function(successCbk, errorCbk, args) {
+            var storage = args.storage || 'config',
+                tenantId = args.tenantId;
+
+            if(storage && tenantId) {
+                TopologyDataLoaders.getL2L3(storage, tenantId, successCbk, errorCbk);
+            } else {
+                //different kind of error
+                errorCbk();
+            }
+        };
+
+        loaders[GBPConstants.strings.mock] = function(successCbk, errorCbk) {
+            var data = MockServices.mockTopoData();
+            successCbk(data.nodes, data.links);
+        };
+
+        ts.getConsProvLabel = function(edge, topo){
+            var provName = '',
+                conName = '';
+
+            topo.nodes.forEach(function(n){
+
+                if ( edge.source === n.id ) {
+                    provName = n.name;
+                }
+
+                if ( edge.target === n.id ) {
+                    conName = n.name;
+                }
+            });
+
+            return provName + ':' + conName;
+        };
+
+        ts.getLegend = function(type) {
+            if(type === null || legends.hasOwnProperty(type) === false) {
+                type = GBPConstants.strings.empty;
+            }
+
+            return legends[type];
+        };
+
+        ts.loadTopology = function(type, successCbk, errorCbk, args) {
+            if(type === null || loaders.hasOwnProperty(type) === false) {
+                type = GBPConstants.strings.empty;
+            }
+
+            loaders[type](successCbk, errorCbk, args);
+        };
+
+        return ts;
+    });
+
+    gbp.register.factory('GPBServices', function(GBPRestangular) {
+
+        var s = {};
+
+        s.getDefinitions = function(successCbk, errorCbk) {
+            var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');
+
+            restObj.get().then(function(data) {
+                if(data['subject-feature-definitions']) {
+                    var classifiersDefs = data['subject-feature-definitions']['classifier-definition'] || [],
+                        actionsDefs = data['subject-feature-definitions']['action-definition'] || [];
+                        successCbk(classifiersDefs, actionsDefs);
+                } else {
+                    //TODO log error
+                }
+            }, function(res) {
+                // errorCbk(res);
+            });
+        };
+
+        s.getServiceFunctionChains = function(successCbk, errorCbk) {
+            var restObj = GBPRestangular.one('restconf').one('config').one('service-function-chain:service-function-chains');
+
+            restObj.get().then(function(data) {
+                if(data['service-function-chains']) {
+                    successCbk(data['service-function-chains']['service-function-chain']);
+                } else {
+                    //TODO log error
+                }
+            }, function(res) {
+                // errorCbk(res);
+            });
+        };
+
+        s.getUUIDnumber = function() {
+            var d = new Date().getTime();
+            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+                        var r = (d + Math.random()*16)%16 | 0;
+                        d = Math.floor(d/16);
+                        return (c=='x' ? r : (r&0x3|0x8)).toString(16);
+                    });
+        };
+
+        s.createRestObj = function(storage) {
+            storage = storage || 'config';
+            restObj = GBPRestangular.one('restconf').one(storage);
+
+            return restObj;
+        };
+
+        s.send = function(restObj, reqData, successCbk, errorCbk) {
+            restObj.customPUT(reqData).then(function(data) {
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res.data, res.status);
+            });
+        };
+
+        s.post = function(restObj, reqData, successCbk, errorCbk) {
+            restObj.customPOST(reqData).then(function(data) {
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res.data, res.status);
+            });
+        };
+
+        s.delete = function(restObj, successCbk, errorCbk) {
+            restObj.remove().then(function(data) {
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res.data, res.status);
+            });
+        };
+
+        s.load = function(restObj, transformCallback, successCbk, errorCbk) {
+            restObj.get().then(function(data) {
+                var objs = transformCallback(data) || [];
+                successCbk(objs);
+            }, function(res) {
+                errorCbk(res.data, res.status);
+            });
+        };
+
+        s.stripNullValues = function(obj) {
+            Object.keys(obj).forEach(function(k) {
+                if(obj[k] === null) {
+                    delete obj[k];
+                }
+            });
+
+            return obj;
+        };
+
+        s.removeEmptyElementsFromList = function(list) {
+            return list.filter(function(e) {
+                return e !== "";
+            });
+        };
+
+        s.createParamObj = function(name, type, value) {
+            var obj = { name: name };
+
+            obj[type+'-value'] = value;
+
+            return obj;
+        };
+
+        s.getInstanceParamValue = function(param) {
+            return param['int-value'] || param['string-value'] || param['range-value'];
+        };
+
+        s.getDefinitionObjParams = function(defObj, id) {
+            var obj = defObj.filter(function(def) {
+                    return def.id === id;
+                })[0],
+                params = (obj && obj.parameter) ? obj.parameter : [];
+
+            return params;
+
+        };
+
+        s.getPropFromListByProp = function(list, propSrc, targetValue, propDst) {
+            var output = null,
+                selectedObj = list.filter(function(e) {
+                    return e[propSrc] === targetValue;
+                })[0];
+
+            if(selectedObj) {
+                if(propDst) {
+                    output = selectedObj[propDst];
+                } else {
+                    output = selectedObj;
+                }
+            }
+
+            return output;
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPGovernanceServices', function(TopologyDataLoaders) {
+        var s = {};
+
+        var subjectInList = function(subjectName, subjectList) {
+            return subjectList.some(function(s) {
+                return s.name === subjectName;
+            });
+        };
+
+        var EPG = function(epgId, tenantId) {
+            this.id = epgId;
+            this.tenantId = tenantId;
+        };
+
+        var Subject = function(name) {
+            this.name = name;
+            this.rules = [];
+            this.providers = [];
+            this.consumers = [];
+
+            this.addProvider = function(providingEpg) {
+                if(this.providers.indexOf(providingEpg) === -1) {
+                    this.providers.push(providingEpg);
+                }
+            };
+
+            this.addConsumer = function(consumingEpg) {
+                if(this.consumers.indexOf(consumingEpg) === -1) {
+                    this.consumers.push(consumingEpg);
+                }
+            };
+
+            this.addRule = function(rule, classifierInstances) {
+                if(rule['classifier-ref'] && rule['classifier-ref'].length > 0) {
+                    
+                    rule['classifier-ref'].forEach(function(cr) {
+                        //cr['parameters'] = [];
+                        classifierInstances.forEach(function(ci) {
+                            if(ci['name'] === cr['instance-name']) {
+                                cr['parameters'] = ci['parameter-value'];
+                            }
+                        });
+                    });
+                }
+
+                this.rules.push(rule);
+            };
+        };
+
+        var addEpg = function(epgList, epgId, tenantId) {
+                var addedEpg = null;
+
+                if(epgList.some(function(epg) {
+                    return epg.id === epgId && epg.tenantId === tenantId;
+                }) === false) {
+                    addedEpg = new EPG(epgId, tenantId);
+                }
+
+                if(addedEpg !== null) {
+                    epgList.push(addedEpg);
+                }
+
+                return addedEpg;
+            },
+            addSubject = function(subject, subjects, providerEpg, consumerEpg, classifierInstances) {
+                //console.log('classifierInstances:', classifierInstances);
+                var existingSubject = subjects.filter(function(s) {
+                        return s.name === subject.name;
+                    })[0],
+                    newSubject = (existingSubject === undefined);
+
+                if(newSubject) {
+                    existingSubject = new Subject(subject.name);
+                }
+
+                existingSubject.addProvider(providerEpg);
+                existingSubject.addConsumer(consumerEpg);
+                
+                if(subject['ui-rule'] && subject['ui-rule'].length > 0) {
+                    subject['ui-rule'].forEach(function(r) {
+                        existingSubject.addRule(r, classifierInstances);
+                    });
+                }
+                
+                if(newSubject) {
+                    subjects.push(existingSubject);
+                }
+            },
+            processPairData = function(providers, consumers, subjects, pairData, classifierInstances) {
+                addEpg(providers, pairData['provider-endpoint-group-id'], pairData['provider-tenant-id']);
+                addEpg(consumers, pairData['consumer-endpoint-group-id'], pairData['consumer-tenant-id']);
+
+                pairData['ui-subject'].forEach(function(s) {
+                    addSubject(s, subjects, pairData['provider-endpoint-group-id'], pairData['consumer-endpoint-group-id'], classifierInstances);
+                });
+            };
+
+        s.getEPGsAndSubjects = function(tenantId, classifierInstances, successCbk, errorCbk) {
+            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, 
+                function(data) {
+                    var epgPairs = data.output['endpoint-group-pair-with-subject'],
+                        consumers = [],
+                        providers = [],
+                        subjects = [];
+
+                    if(epgPairs) {
+                        epgPairs.forEach(function(p) {
+                            processPairData(providers, consumers, subjects, p, classifierInstances);
+                        });
+                    }
+
+                    successCbk({providers: providers, consumers: consumers, subjects: subjects});
+                },
+                function() {
+                    //TODO log error
+            });
+        };
+
+        return s;
+    });
+
+    gbp.register.factory('GBPTenantServices', function(GPBServices) {
+
+        var s = {};
+
+        var Tenant = function(id, name, description) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.name = name || null;
+            this.description = description || null;
+        };
+
+        var createBaseRestObj = function() {
+            return GPBServices
+                .createRestObj().one('policy:tenants');
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj().one('tenant').one(pathObj.tenantId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new Tenant(rawObj.id, rawObj.name, rawObj.description);
+            // });
+            return rawData.tenants.tenant;
+        };
+
+        var createData = function(obj) {
+            return { tenant : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId) {
+            return {
+                tenantId: tenantId
+            };
+        };
+
+        s.createObj = function() {
+            return new Tenant();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.modify = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(successCbk, errorCbk) {
+            var restObj = createBaseRestObj();
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPContractServices', function(GPBServices) {
+
+        var s = {};
+
+        var Contract = function(id, description, parent) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.description = description || null;
+            this.parent = parent || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj().one('policy:tenants').one('tenant').one(pathObj.tenantId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('contract').one(pathObj.contractId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new Contract(rawObj.id, rawObj.description);
+            // });
+            return rawData.tenant[0].contract;
+        };
+
+        var createData = function(obj) {
+            return { contract : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, contractId) {
+            return {
+                tenantId: tenantId,
+                contractId: contractId
+            };
+        };
+
+        s.createObj = function() {
+            return new Contract();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPClauseServices', function(GPBServices) {
+
+        var s = {};
+
+        var Clause = function(name, subjectRefs) {
+            this.name = name || null;
+            this['subject-refs'] = subjectRefs || [];
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId)
+                .one('contract').one(pathObj.contractId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('clause').one(pathObj.clauseId);
+        };
+
+        var transformCallback = function(rawData) {
+            var data = null,
+                clauseData = rawData.contract[0].clause;
+
+            if(clauseData) {
+                data = clauseData.map(function(elem) {
+                    if(elem.hasOwnProperty('subject-refs') === false) {
+                        elem['subject-refs'] = [];
+                    }
+                    return elem;
+                });
+            }
+
+            return data;
+        };
+
+        var createData = function(obj) {
+            var o = GPBServices.stripNullValues(obj);
+
+            if(o['subject-refs']) {
+                o['subject-refs'] = GPBServices.removeEmptyElementsFromList(o['subject-refs']);
+            }
+
+            return { clause : [ o ] };
+        };
+
+        s.createPathObj = function(tenantId, contractId, clauseId) {
+            return {
+                tenantId: tenantId,
+                contractId: contractId,
+                clauseId: clauseId
+            };
+        };
+
+        s.createObj = function() {
+            return new Clause();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPSubjectServices', function(GPBServices) {
+
+        var s = {};
+
+        var Subject = function(name, order) {
+            this.name = name || null;
+            this.order = order || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId)
+                .one('contract').one(pathObj.contractId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('subject').one(pathObj.subjectId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new Subject(rawObj.name, rawObj.order);
+            // });
+            return rawData.contract[0].subject;
+        };
+
+        var createData = function(obj) {
+            return { subject : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, contractId, subjectId) {
+            return {
+                tenantId: tenantId,
+                contractId: contractId,
+                subjectId: subjectId
+            };
+        };
+
+        s.createObj = function() {
+            return new Subject();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPRuleServices', function(GPBServices) {
+
+        var s = {};
+
+        var Rule = function(name, order) {
+            this.name = name || null;
+            this.order = order || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant')
+                .one(pathObj.tenantId).one('contract').one(pathObj.contractId)
+                .one('subject').one(pathObj.subjectId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('rule').one(pathObj.ruleId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new Rule(rawObj.name, rawObj.order);
+            // });
+            return rawData.subject[0].rule;
+        };
+
+        var createData = function(obj) {
+            return { rule : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, contractId, subjectId, ruleId) {
+            return {
+                tenantId: tenantId,
+                contractId: contractId,
+                subjectId: subjectId,
+                ruleId: ruleId
+            };
+        };
+
+        s.createObj = function() {
+            return new Rule();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPClassifierRefsServices', function(GPBServices) {
+
+        var s = {};
+
+        var ClassifierRef = function(name, direction, instanceName, connectionTracking) {
+            this.name = name || null;
+            this.direction = direction || null;
+            this['instance-name'] = instanceName || null;
+            this['connection-tracking'] = connectionTracking || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant')
+                .one(pathObj.tenantId).one('contract').one(pathObj.contractId)
+                .one('subject').one(pathObj.subjectId)
+                .one('rule').one(pathObj.ruleId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('classifier-ref').one(pathObj.classifierRefId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new ClassifierRef(rawObj.name, rawObj.direction, rawObj['instance-name']);
+            // });
+            return rawData.rule[0]['classifier-ref'];
+        };
+
+        var createData = function(obj) {
+            return { 'classifier-ref' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, contractId, subjectId, ruleId, classifierRefId) {
+            return {
+                tenantId: tenantId,
+                contractId: contractId,
+                subjectId: subjectId,
+                ruleId: ruleId,
+                classifierRefId: classifierRefId
+            };
+        };
+
+        s.createObj = function() {
+            return new ClassifierRef();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPActionRefsServices', function(GPBServices) {
+
+        var s = {};
+
+        var ActionRef = function(name, order, instanceName) {
+            this.name = name || null;
+            this.order = order || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant')
+                .one(pathObj.tenantId).one('contract').one(pathObj.contractId)
+                .one('subject').one(pathObj.subjectId)
+                .one('rule').one(pathObj.ruleId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('action-ref').one(pathObj.actionRefId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new ActionRef(rawObj.name, rawObj.order);
+            // });
+            return rawData.rule[0]['action-ref'];
+        };
+
+        var createData = function(obj) {
+            return { 'action-ref' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, contractId, subjectId, ruleId, actionRefId) {
+            return {
+                tenantId: tenantId,
+                contractId: contractId,
+                subjectId: subjectId,
+                ruleId: ruleId,
+                actionRefId: actionRefId
+            };
+        };
+
+        s.createObj = function() {
+            return new ActionRef();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPL2FloodDomainServices', function(GPBServices) {
+
+        var s = {};
+
+        var L2FloodDomain = function(id, name, description, parent) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.name = name || null;
+            this.description = description || null;
+            this.parent = parent || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('l2-flood-domain').one(pathObj.l2FloodDomain);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new L2FloodDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent);
+            // });
+            return rawData.tenant[0]['l2-flood-domain'];
+        };
+
+        var createData = function(obj) {
+            return { 'l2-flood-domain' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, l2FloodDomain) {
+            return {
+                tenantId: tenantId,
+                l2FloodDomain: l2FloodDomain
+            };
+        };
+
+        s.createObj = function() {
+            return new L2FloodDomain();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPL2BridgeDomainServices', function(GPBServices) {
+
+        var s = {};
+
+        var L2BridgeDomain = function(id, name, description, parent) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.name = name || null;
+            this.description = description || null;
+            this.parent = parent || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant')
+                .one(pathObj.tenantId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('l2-bridge-domain').one(pathObj.l2BridgeDomain);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new L2BridgeDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent);
+            // });
+            return rawData.tenant[0]['l2-bridge-domain'];
+        };
+
+        var createData = function(obj) {
+            return { 'l2-bridge-domain' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, l2BridgeDomain) {
+            return {
+                tenantId: tenantId,
+                l2BridgeDomain: l2BridgeDomain
+            };
+        };
+
+        s.createObj = function() {
+            return new L2BridgeDomain();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPL3ContextServices', function(GPBServices) {
+
+        var s = {};
+
+        var L3Context = function(id, name, description) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.name = name || null;
+            this.description = description || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('l3-context').one(pathObj.l3Context);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);
+            // });
+            return rawData.tenant[0]['l3-context'];
+        };
+
+        var createData = function(obj) {
+            return { 'l3-context' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, l3Context) {
+            return {
+                tenantId: tenantId,
+                l3Context: l3Context
+            };
+        };
+
+        s.createObj = function() {
+            return new L3Context();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPSubnetServices', function(GPBServices) {
+
+        var s = {};
+
+        var Subnet = function(id, name, description, parent, ipPrefix, virtualRouterIp) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.name = name || null;
+            this.description = description || null;
+            this.parent = parent || null;
+            this['ip-prefix'] = ipPrefix || null;
+            this['virtual-router-ip'] = virtualRouterIp || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('subnet').one(pathObj.subnet);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);
+            // });
+            return rawData.tenant[0]['subnet'];
+        };
+
+        var createData = function(obj) {
+            return { 'subnet' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, subnet) {
+            return {
+                tenantId: tenantId,
+                subnet: subnet
+            };
+        };
+
+        s.createObj = function() {
+            return new Subnet();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPGatewayServices', function(GPBServices) {
+
+        var s = {};
+
+        var Gateway = function(gateway) {
+            this.gateway = gateway || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('gateways').one(pathObj.gateway);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);
+            // });
+            return rawData.subnet[0]['gateways'];
+        };
+
+        var createData = function(obj) {
+            return { 'gateways' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, subnetId, gateway) {
+            return {
+                tenantId: tenantId,
+                subnetId: subnetId,
+                gateway: gateway
+            };
+        };
+
+        s.createObj = function() {
+            return new Gateway();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPPrefixServices', function(GPBServices) {
+
+        var s = {};
+
+        var Prefix = function(prefix) {
+            this.prefix = prefix || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId).one('gateways').one(pathObj.gatewayId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('prefixes').one(pathObj.prefixId);
+        };
+
+        var transformCallback = function(rawData) {
+            // return rawData.map(function(rawObj){
+            //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);
+            // });
+            return rawData.gateways[0].prefixes;
+        };
+
+        var createData = function(obj) {
+            return { 'prefixes' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, subnetId, gatewayId, prefixId) {
+            return {
+                tenantId: tenantId,
+                subnetId: subnetId,
+                gatewayId: gatewayId,
+                prefixId: prefixId ? prefixId.replace("/", "%2F") : prefixId
+            };
+        };
+
+        s.createObj = function() {
+            return new Prefix();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPClassifierInstanceServices', function(GPBServices) {
+
+        var s = {};
+
+        var ClassifierService = function(name, classifierDefId) {
+            this.name = name || null;
+            this['classifier-definition-id'] = classifierDefId || null;
+            this['parameter-value'] = [];
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances');
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('classifier-instance').one(pathObj.classfierInstanceId);
+        };
+
+        var transformCallback = function(rawData) {
+            return rawData['subject-feature-instances']['classifier-instance'];
+        };
+
+        var createData = function(obj) {
+            return { 'classifier-instance' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, classfierInstanceId) {
+            return {
+                tenantId: tenantId,
+                classfierInstanceId: classfierInstanceId
+            };
+        };
+
+        s.createObj = function() {
+            return new ClassifierService();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPActionInstanceServices', function(GPBServices) {
+
+        var s = {};
+
+        var ActionService = function(name, actionDefId) {
+            this.name = name || null;
+            this['action-definition-id'] = actionDefId || null;
+            this['parameter-value'] = [];
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances');
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('action-instance').one(pathObj.actionInstanceId);
+        };
+
+        var transformCallback = function(rawData) {
+            return rawData['subject-feature-instances']['action-instance'];
+        };
+
+        var createData = function(obj) {
+            return { 'action-instance' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, actionInstanceId) {
+            return {
+                tenantId: tenantId,
+                actionInstanceId: actionInstanceId
+            };
+        };
+
+        s.createObj = function() {
+            return new ActionService();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        s.getDefinitions = function(successCbk, errorCbk) {
+            var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');
+                
+            restObj.get().then(function(data) {
+                successCbk(data['subject-feature-definitions']['action-definition']);
+            }, function(res) {
+                // errorCbk(res);
+            });
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPEpgServices', function(GPBServices) {
+
+        var s = {};
+
+        var EPG = function(name, description, intraGroupPolicy, networkDomain, id, parent) {
+            this.id = id || GPBServices.getUUIDnumber();
+            this.name = name || null;
+            this.description = description || null;
+            this['intra-group-policy'] = intraGroupPolicy || null;
+            this['network-domain'] = networkDomain || null;
+            this.parent = parent || null;
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('endpoint-group').one(pathObj.epgId);
+        };
+
+        var transformCallback = function(rawData) {
+            return rawData.tenant[0]['endpoint-group'];
+        };
+
+        var createData = function(obj) {
+            return { 'endpoint-group' : [ GPBServices.stripNullValues(obj) ] };
+        };
+
+        s.createPathObj = function(tenantId, epgId) {
+            return {
+                tenantId: tenantId,
+                epgId: epgId
+            };
+        };
+
+        s.createObj = function() {
+            return new EPG();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPConNamedSelServices', function(GPBServices) {
+
+        var s = {};
+
+        var ConsumerNamedSelector = function(name, contract) {
+            this.name = name || null;
+            this.contract = contract || [];
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('consumer-named-selector').one(pathObj.cnsId);
+        };
+
+        var transformCallback = function(rawData) {
+            var data = null,
+                consumerData = rawData['endpoint-group'][0]['consumer-named-selector'];
+
+            if(consumerData) {
+                data = consumerData.map(function(elem) {
+                    if(elem.hasOwnProperty('contract') === false) {
+                        elem.contract = [];
+                    }
+                    return elem;
+                });
+            }
+
+            return data;
+        };
+
+        var createData = function(obj) {
+            var o = GPBServices.stripNullValues(obj);
+
+            if(o.contract) {
+                o.contract = GPBServices.removeEmptyElementsFromList(o.contract);
+            }
+
+            return { 'consumer-named-selector' : [ o ] };
+        };
+
+        s.createPathObj = function(tenantId, epgId, cnsId) {
+            return {
+                tenantId: tenantId,
+                epgId: epgId,
+                cnsId: cnsId
+            };
+        };
+
+        s.createObj = function() {
+            return new ConsumerNamedSelector();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+
+    gbp.register.factory('GBPProNamedSelServices', function(GPBServices) {
+
+        var s = {};
+
+        var ProviderNamedSelector = function(name, contract) {
+            this.name = name || null;
+            this.contract = contract || [];
+        };
+
+        var createBaseRestObj = function(pathObj) {
+            return GPBServices.createRestObj()
+                .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId);
+        };
+
+        var createRestObj = function(pathObj) {
+            return createBaseRestObj(pathObj).one('provider-named-selector').one(pathObj.cnsId);
+        };
+
+        var transformCallback = function(rawData) {
+            var data = null,
+                provderData = rawData['endpoint-group'][0]['provider-named-selector'];
+
+            if(provderData) {
+                data = provderData.map(function(elem) {
+                    if(elem.hasOwnProperty('contract') === false) {
+                        elem.contract = [];
+                    }
+                    return elem;
+                });
+            }
+
+            return data;
+        };
+
+        var createData = function(obj) {
+            var o = GPBServices.stripNullValues(obj);
+
+            if(o.contract) {
+                o.contract = GPBServices.removeEmptyElementsFromList(o.contract);
+            }
+
+            return { 'provider-named-selector' : [ o ] };
+        };
+
+        s.createPathObj = function(tenantId, epgId, cnsId) {
+            return {
+                tenantId: tenantId,
+                epgId: epgId,
+                cnsId: cnsId
+            };
+        };
+
+        s.createObj = function() {
+            return new ProviderNamedSelector();
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path),
+                reqData = createData(obj);
+
+            GPBServices.send(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, successCbk, errorCbk) {
+            var restObj = createRestObj(path);
+
+            GPBServices.delete(restObj, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = createBaseRestObj(path);
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPEndpointServices', function(GPBServices) {
+
+        var s = {};
+
+        var Endpoint = function(tenantId) {
+            this.tenant = tenantId || null;
+            this['network-containment'] = null;
+            this['endpoint-group'] = null;
+            this['endpoint-groups'] = [];
+            this.condition = [];
+            this['l2-context'] = null;
+            this['mac-address'] = null;
+            this['l3-address'] = [];
+        };
+
+        var createRestObj = function() {
+            return GPBServices.createRestObj('operations');
+        };
+
+        var transformCallback = function(rawData) {
+            return rawData.endpoints.endpoint;
+        };
+
+        var createBaseData = function(obj) {
+            var o = GPBServices.stripNullValues(obj);
+
+            if(o.condition) {
+                o.condition = GPBServices.removeEmptyElementsFromList(o.condition);
+            }
+
+            if(o['endpoint-groups']) {
+                o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);
+            }
+
+            if(o['l3-address']) {
+                o['l3-address'] = GPBServices.removeEmptyElementsFromList(o['l3-address']);
+            }
+
+            return o;
+        };
+
+        var createSendData = function(obj) {
+            var o = createBaseData(obj);
+            return { 'input': o };
+        };
+
+        var createDeleteData = function(obj) {
+            var o = { 
+                'input': { 
+                    'l3': obj['l3-address'],
+                    'l2': [
+                        { 
+                            'l2-context': obj['l2-context'],
+                            'mac-address': obj['mac-address']
+                        }
+                    ] 
+                } 
+            };
+
+            return o;
+        };
+
+        s.createObj = function(tenantId) {
+            return new Endpoint(tenantId);
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj().one('endpoint:register-endpoint'),
+                reqData = createSendData(obj);
+
+            GPBServices.post(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path).one('endpoint:unregister-endpoint'),
+                reqData = createDeleteData(obj);
+            GPBServices.post(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('GBPEndpointL3Services', function(GPBServices) {
+
+        var s = {};
+
+        var EndpointL3 = function(tenantId) {
+            this.tenant = tenantId || null;
+            this['endpoint-group'] = null;
+            this['endpoint-groups'] = [];
+            this.condition = [];
+            this['l3-context'] = null;
+            this['ip-prefix'] = null;
+            this['endpoint-l2-gateways'] = [];
+            this['endpoint-l3-gateways'] = [];
+        };
+
+        var createRestObj = function() {
+            return GPBServices.createRestObj('operations');
+        };
+
+        var transformCallback = function(rawData) {
+            return rawData.endpoints['endpoint-l3-prefix'];
+        };
+
+        var createBaseData = function(obj) {
+            var o = GPBServices.stripNullValues(obj);
+
+            if(o.condition) {
+                o.condition = GPBServices.removeEmptyElementsFromList(o.condition);
+            }
+
+            if(o['endpoint-groups']) {
+                o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);
+            }
+
+            if(o['endpoint-l2-gateways']) {
+                o['endpoint-l2-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l2-gateways']);
+            }
+
+            if(o['endpoint-l3-gateways']) {
+                o['endpoint-l3-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l3-gateways']);
+            }
+
+            return o;
+        };
+
+        var createSendData = function(obj) {
+            var o = createBaseData(obj);
+            return { 'input': o };
+        };
+
+        var createDeleteData = function(obj) {
+            var o = { 
+                'input': { 
+                    'l3-prefix': [
+                        {
+                            'l3-context': obj['l3-context'],
+                            'ip-prefix': obj['ip-prefix']
+                        }
+                    ],
+                    'l2': obj['endpoint-l2-gateways'],
+                    'l3': obj['endpoint-l3-gateways']
+                } 
+            };
+
+            return o;
+        };
+
+        s.createObj = function(tenantId) {
+            return new EndpointL3(tenantId);
+        };
+
+        s.send = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj().one('endpoint:register-l3-prefix-endpoint'),
+                reqData = createSendData(obj);
+
+            GPBServices.post(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.delete = function(path, obj, successCbk, errorCbk) {
+            var restObj = createRestObj(path).one('endpoint:unregister-endpoint'),
+                reqData = createDeleteData(obj);
+
+            GPBServices.post(restObj, reqData, successCbk, errorCbk);
+        };
+
+        s.load = function(path, successCbk, errorCbk) {
+            var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');
+
+            GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
+        };
+
+        return s;
+
+    });
+
+    gbp.register.factory('PGNServices', function(GBPRestangular) {
+
+        var s = {};
+
+        var idGetter = {};
+
+        var idTypes = {
+            tenant: 'TENANT',
+            uuid: 'UUID',
+            l3ctx: 'L3CTX',
+            pathAction: 'PATHACTION',
+            accessAction: 'ACCESSACTION'
+        };
+
+        idGetter[idTypes.tenant] = function() {
+            return 1;
+        };
+
+        idGetter[idTypes.uuid] = function() {
+            return 2;
+        };
+
+        idGetter[idTypes.l3ctx] = function() {
+            return 3;
+        };
+
+        idGetter[idTypes.pathAction] = function() {
+            return 4;
+        };
+
+        idGetter[idTypes.accessAction] = function() {
+            return 5;
+        };
+
+        var getId = function(type) {
+            if(idGetter.hasOwnProperty(type)) {
+                return id = idGetter[type]();
+            } else {
+                throw "Cannot get idGetter for type " + type;
+            }
+        };
+
+        s.addReplaceEndpointGroup = function(successCbk, errorCbk, groupName, sgt, description) {
+            var tenantId = getId(idTypes.tenant),
+                uuid = getId(idTypes.uuid),
+                restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'pgn-application:create-or-replace-endpoint-groups',
+                reqData = {
+                               "input": 
+                                {
+                                    "endpoint-group":[
+                                    {
+                                        "pgn-application:tenant-id": tenantID, 
+                                        "pgn-application:id":uuid,
+                                        "pgn-application:security-group-tag":sgt,
+                                        "pgn-application:name":groupName,
+                                        "pgn-application:description":description
+                                    }
+                                ]
+                            }
+                        };
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        s.deleteEndpointGroup = function(successCbk, errorCbk, uuid) {
+            var tenantId = getId(idTypes.tenant),
+                restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'pgn-application:delete-endpoint-groups',
+                reqData = {
+                            "input": {
+                                "endpoint-group":[
+                                    {
+                                        "pgn-application:tenant-id": tenantId, 
+                                        "pgn-application:id":uuid
+                                    }
+                                ]
+                            }
+                        };
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        s.getActions = function(successCbk, errorCbk) {
+            var tenantId = getId(idTypes.tenant),
+                pathActionId = getId(idTypes.pathAction),
+                accessActionId = getId(idTypes.accessAction),
+                restObj = GBPRestangular.one('restconf').one('config').one('policy:tenants',  tenantId).one('subject-feature-instances');
+
+            restObj.get().then(function(data) {
+                successCbk(data); //TODO fill actions
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        s.applyPolicy = function(successCbk, errorCbk, providerId, consumerId, pathSelRule, accessCtrlRule) {
+            var restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'pgn-application:wire-endpoint-groups',
+                actionRefName = (pathSelRule ? pathSelRule : '') + (accessCtrlRule ? accessCtrlRule : ''),
+                reqData = {
+                               "input": {
+                                    "endpoint-group-pair-with-rules": {
+                                        "pgn-application:provider-tenant-id": tenantID, 
+                                        "pgn-application:consumer-tenant-id": tenantID, 
+                                        "pgn-application:provider-group-id":providerId,
+                                        "pgn-application:consumer-group-id":consumerId,
+                                        "pgn-application:group-rule": [
+                                            {
+                                                "action-ref": [pathSelRule, accessCtrlRule].map(function(r) {
+                                                    return { "name":r };
+                                                }),
+                                                "name":actionRefName
+                                            }
+                                        ]
+                                    }
+                                }
+                            };
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                successCbk(data); //TODO reload policies
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        s.deletePolicy = function(successCbk, errorCbk, providerId, consumerId) {
+            var tenantId = getId(idTypes.tenant),
+                restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'pgn-application:unwire-endpoint-groups',
+                reqData = {
+                           "input": 
+                            {
+                                "endpoint-group-pair":[
+                                    {
+                                        "pgn-application:provider-tenant-id": tenantId, 
+                                        "pgn-application:consumer-tenant-id": tenantId, 
+                                        "pgn-application:provider-group-id":providerId,
+                                        "pgn-application:consumer-group-id":consumerId
+                                    }
+                                ]
+                            }
+                        };
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                successCbk(data); //TODO reload policies
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        s.addEndPoint = function(successCbk, errorCbk, ipAddress, groupId) {
+            var l3ctxId = getId(idTypes.l3ctx),
+                tenantId = getId(idTypes.tenant),
+                restObj = GBPRestangular.one('restconf').one('operations'),
+                rpcRes = 'endpoint:register-endpoint',
+                reqData = {
+                            "input": {
+                                "endpoint-group": groupId,
+                                "l3-address": [
+                                    {
+                                        "ip-address": ipAddress,
+                                        "l3-context": l3ctxId
+                                    }
+                                ],
+                                "tenant": tenantId
+                            }
+                        };
+
+            restObj.post(rpcRes, reqData).then(function(data) {
+                successCbk(data);
+            }, function(res) {
+                errorCbk(res);
+            });
+        };
+
+        s.getUUIDnumber = function() {
+            var d = new Date().getTime();
+            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+                        var r = (d + Math.random()*16)%16 | 0;
+                        d = Math.floor(d/16);
+                        return (c=='x' ? r : (r&0x3|0x8)).toString(16);
+                    });
+        };
+
+        return s;
+    });
+
+    gbp.register.factory('DesignGbpFactory', function(){
+
+        var dvf = {};
+
+        dvf.setMainClass = function(){
+            if ( $('.gbpWrapper').length ) {
+                $('.gbpWrapper').closest('.col-xs-12').addClass('gbpGlobalWrapper');
+              }
+        };
+
+        return dvf;
+
+    });
+
+    gbp.register.factory('JointGraphOffsetFactory', function(GBPConstants){
+        var jgof = {};
+
+        jgof.createWHObj = function(w, h) {
+            return {w: w || 0, h: h || 0};
+        };
+
+        jgof.updateOffsets = function(delta, offset, margin, maximums, paper) {
+            offset.w = offset.w + delta.w + margin.w;
+
+            if(offset.w >= maximums.w) {
+                paper.setDimensions(offset.w + 30, paper.options.height);
+                offset.w = offset.ow;
+                offset.h = offset.h + margin.h;
+            }
+
+        };
+
+        jgof.resetOffsets = function(offset, w, h) {
+            offset.w = w;
+            offset.h = h;
+        };
+
+        jgof.getCurrentOffset = function(array, type) {
+            var max = 0;
+            array.forEach(function(item){
+                max = item.attributes.position[type] > max ? item.attributes.position[type] : max;
+            });
+
+            return max;
+        };
+
+        jgof.checkObjsHoffsets = function(array, size, paper) {
+            var lastPosY = 0,
+                addOffset = false,
+                cellBottomOffset = 80,
+                setItemPosition = function(item, type) {
+                    while (item.attributes.position[type] < size + cellBottomOffset) {
+                        item.translate(null, cellBottomOffset);
+                    }
+                };
+
+            array.forEach(function(item){
+                addOffset = (size + cellBottomOffset) >= item.attributes.position.y;
+
+                if ( addOffset ) {
+                    setItemPosition(item, 'y');
+                }
+
+                if ( item.attributes.position.y + cellBottomOffset > paper.options.height ) {
+                    paper.setDimensions(paper.options.width, paper.options.height + cellBottomOffset);
+                }
+            });
+        };
+
+        return jgof;
+    });
+
+    gbp.register.factory('JointGraphFactory', function(GBPConstants){
+        var defaulColor = 'blue';
+
+        var jgf = {};
+
+        jgf.getLabelLength = function(length) {
+            return length * 10 > 200 ? 200 : length * 10;
+        };
+
+        jgf.createGraph = function() {
+            var graph = new joint.dia.Graph();
+
+            var paper = new joint.dia.Paper({
+                el: $('#graph'),
+                width: 1300,
+                height: 650,
+                model: graph,
+                gridSize: 1,
+                interactive: { vertexAdd: false }
+            });
+
+            return paper;
+        };
+
+        jgf.resetGraphDimension = function(paper, element, paddingT, paddingL){
+            paddingT = paddingT ? paddingT : 0;
+            paddingL = paddingL ? paddingL : paddingT;
+
+            var paperWidth = element.width() - paddingL,
+                paperHeight = element.height() - paddingT - 5;
+
+            paper.setDimensions(paperWidth, paperHeight);
+        };
+
+        jgf.reloadGraph = function(graph) {
+            graph.clear();
+        };
+
+        jgf.createElement = function(elementName, posx, posy, width, height, objectType, object, tooltip, bgcolor, titleName) {
+            var setWidth = function(width) {
+                return width < GBPConstants.jointElements.minWidth ? GBPConstants.jointElements.minWidth : 
+                       width > GBPConstants.jointElements.maxWidth ? GBPConstants.jointElements.maxWidth : width;
+            };
+
+            var setHeight = function(height) {
+                return height < GBPConstants.jointElements.minHeight ? GBPConstants.jointElements.minHeight : 
+                       height > GBPConstants.jointElements.maxHeight ? GBPConstants.jointElements.maxHeight : height;
+            };
+
+            // joint.shapes.basic.Rect = joint.shapes.basic.Generic.extend({
+            joint.shapes.html = {};
+            joint.shapes.html.Element = joint.shapes.basic.Generic.extend({
+
+                markup: '<g class="rotatable"><g class="scalable"><rect/><title /></g><text class="text1"></text><text class="text2"></text><title /></g>',
+                
+                defaults: joint.util.deepSupplement({
+                    type: 'html.Element',
+                    attrs: {
+                        'rect': { fill: bgcolor, stroke: 'black', 'follow-scale': true, width: 80, height: 40, cursor: 'pointer' },
+                        '.text1': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.3, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer', 'font-weight' : 'bold'},
+                        '.text2': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.7, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer'},
+                        'title': {text: tooltip},
+                    }
+                    
+                }, joint.shapes.basic.Generic.prototype.defaults)
+            });
+
+            // joint.shapes.html.ElementView = joint.dia.ElementView.extend({
+
+            //     template: [
+            //         '<input class="html-element" type="text" value="'+elementName+'"/>',
+            //         ''
+            //     ].join(''),
+
+            //     initialize: function() {
+            //         _.bindAll(this, 'updateBox');
+            //         joint.dia.ElementView.prototype.initialize.apply(this, arguments);
+
+            //         this.$box = $(_.template(this.template)());
+            //         // Prevent paper from handling pointerdown.
+            //         this.$box.find('input,select').on('mousedown click', function(evt) { evt.stopPropagation(); });
+            //         // This is an example of reacting on the input change and storing the input data in the cell model.
+            //         this.$box.find('input').on('change', _.bind(function(evt) {
+            //             this.model.set('input', $(evt.target).val());
+            //         }, this));
+            //         this.$box.find('button').on('click', _.bind(function(evt) {
+            //             this.model.set('button', $('.divc').css('display','block'));
+            //         }, this));
+            //         // Update the box position whenever the underlying model changes.
+            //         this.model.on('change', this.updateBox, this);
+
+            //         this.updateBox();
+            //     },
+            //     render: function() {
+            //         joint.dia.ElementView.prototype.render.apply(this, arguments);
+            //         this.paper.$el.prepend(this.$box);
+            //         this.updateBox();
+            //         return this;
+            //     },
+            //     updateBox: function() {
+            //         // Set the position and dimension of the box so that it covers the JointJS element.
+            //         var bbox = this.model.getBBox();
+            //         // Example of updating the HTML with a data stored in the cell model.
+            //         this.$box.css({ width: bbox.width, height: bbox.height, left: bbox.x, top: bbox.y, transform: 'rotate(' + (this.model.get('angle') || 0) + 'deg)' });
+            //     },
+            //     removeBox: function(evt) {
+            //         this.$box.remove();
+            //     }
+            // });
+
+            elementName = elementName.length > 20 ? elementName.slice(0,20) + '...' : elementName;
+            // width = width > 200 ? 200 : width;
+
+            // return new joint.shapes.basic.Rect({
+            return new joint.shapes.html.Element({
+                position: { x: posx || 0, y: posy || 0 },
+                size: { width: width ||  GBPConstants.jointElements.minWidth, height: height || GBPConstants.jointElements.minHeight },
+                attrs: { rect: { fill: bgcolor }, '.text1': { fill: 'black', text: titleName}, '.text2': { fill: 'black', text: elementName }},
+                objType: objectType,
+                objData: object
+            });
+        };
+
+        jgf.transformElement = function(element, transformX, transformY) {
+            return element.translate(transformX, transformY);
+        };
+
+        jgf.addItem = function(graph, item) {
+            graph.addCells([item]);
+        };
+
+        jgf.addItemList = function(graph, listItem) {
+            graph.addCells(listItem);
+        };
+
+        jgf.createLink = function(srcId, targetId, colorIn, colorOut, direction, objData) {
+            colorIn = colorIn || defaulColor;
+            colorOut = colorOut || defaulColor;
+
+            var labelTextColor = GBPConstants.colors[GBPConstants.strings.sigmaTopoDefaultText],
+                labelBckColor = GBPConstants.colors[GBPConstants.strings.linklabel];
+
+            var linkObj = {
+                source: { id: srcId },
+                target: { id: targetId },
+                attrs: {
+                    '.connection': { stroke: colorIn, 'stroke-width': 2, name: 'normal' },
+                    '.connection-wrap': { 'stroke-width': 10 } 
+                },
+                objData: objData
+            };
+
+            if(direction === 'in' || direction == 'bidirectional' || direction === undefined || direction === null) {
+                linkObj.attrs['.marker-target'] = { fill: colorIn, d: 'M 10 0 L 0 5 L 10 10 z' };
+            }
+
+            if(direction === 'out' || direction == 'bidirectional') {
+                linkObj.attrs['.marker-source'] = { fill: colorOut, d: 'M 10 0 L 0 5 L 10 10 z' };
+            }
+
+            var link = new joint.dia.Link(linkObj);
+
+            // if(labelText) {
+            //     link.label(0, { position: 0.3, attrs: { text: { text: labelText, fill: labelTextColor }, rect: { stroke: labelBckColor, 'stroke-width': 20 }}});
+            // }
+
+
+            return link;
+        };
+
+        return jgf;
+    });
+
+    gbp.register.factory('GBPJointGraphBuilder', function(GBPRestangular, GBPConstants, JointGraphFactory, JointGraphOffsetFactory, TopologyDataLoaders){
+        var jgb = {};
+
+        var builders = {};
+
+        var buildJointData = function(paper, nodes, links) {
+
+        };
+
+        var setOperConfigTopoData = function(paper, data){
+            var topo = TopologyDataLoaders.getEpgTopo(data);
+
+            var offsetObj = {
+                    ow: 100,
+                    oh: 100,
+                    w: 100,
+                    h: 100
+                },
+                marginObj = {
+                    w: 50,
+                    h: 80
+                },
+                offsetHobj = {
+                    pEpg: 0,
+                    cEpg: 0,
+                    subject: 0
+                },
+                itemsArray = {
+                    epg: []
+                },
+                linksArray = [];
+
+            JointGraphFactory.resetGraphDimension(paper, $('.policyGraphWrapper'));
+            JointGraphFactory.reloadGraph(paper.model);
+
+            var deg2rad = function(deg){
+                return deg * Math.PI / 180;
+            };
+
+            var getXYInCircle = function(elementIndex, elementsCount, paperCenterX, paperCenterY, elementWidth, elementHeight){
+                var result = {x:0, y:0};
+                    circleMargin = 100;
+                    r = (paperCenterX < paperCenterY ? paperCenterX : paperCenterY ) - circleMargin;
+                    degs = 360 / elementsCount * (elementIndex+1) + 180;
+                    rads = deg2rad(degs);
+                
+                elementWidth = elementWidth ? elementWidth : GBPConstants.jointElements.minWidth;
+                elementHeight = elementHeight ? elementHeight : GBPConstants.jointElements.minHeight;
+                
+                if(elementWidth < GBPConstants.jointElements.minWidth){elementWidth = GBPConstants.jointElements.minWidth;}
+                if(elementWidth > GBPConstants.jointElements.maxWidth){elementWidth = GBPConstants.jointElements.maxWidth;}
+                if(elementHeight < GBPConstants.jointElements.minHeight){elementHeight = GBPConstants.jointElements.minHeight;}
+                if(elementHeight > GBPConstants.jointElements.maxHeight){elementHeight = GBPConstants.jointElements.maxHeight;}
+                    
+                result.x = paperCenterX + r * Math.cos(rads);
+                result.y = paperCenterY + r * Math.sin(rads);
+                
+                degs = degs % 360;
+                if(degs > 90 && degs < 270){
+                    result.x = result.x - elementWidth;
+                }
+                if(degs == 90 || degs == 270){
+                    result.x = result.x - elementWidth / 2;
+                }
+                if(degs > 180 && degs < 360){
+                    result.y = result.y - elementHeight;
+                }
+                if(degs === 0 || degs == 180){
+                    result.y = result.y - elementHeight / 2;
+                }
+                return result;
+            };
+            
+            var paperCenterX = (paper.options.width) / 2;
+            var paperCenterY = (paper.options.height) / 2;
+            topo.nodes.forEach(function(i, index){
+                var label = i.label,
+                    header = 'Epg',
+                    width =  Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)),
+                    color = GBPConstants.colors[GBPConstants.strings.epg];
+                    
+                var itemPos = getXYInCircle(index, topo.nodes.length, paperCenterX, paperCenterY, width, null);
+                var item = JointGraphFactory.createElement(label, itemPos.x, itemPos.y, width, null, GBPConstants.strings.epg , i, label, color, header);
+
+                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);
+            });
+
+            var getItemById = function(id, array){
+                var item = array.filter(function(i){
+                    return i.attributes.objData.id === id;
+                });
+
+                return item.length ? item[0] : null;
+            };
+
+            topo.links.forEach(function(l){
+                var sourceItem = getItemById(l.source, itemsArray.epg),
+                    targetItem = getItemById(l.target, itemsArray.epg);
+
+                if (sourceItem && targetItem) {
+                    var link = JointGraphFactory.createLink(sourceItem.id, targetItem.id, 'blue', 'green', l.direction, l.data);
+                    linksArray.push(link);
+                }
+            });
+
+            JointGraphFactory.addItemList(paper.model, linksArray);
+        };
+
+        jgb.loadTopology = function(args, paper, type) {
+            if(type === null || builders.hasOwnProperty(type) === false) {
+                type = GBPConstants.strings.empty;
+            }
+
+            builders[type](args, paper);
+        };
+
+        builders[GBPConstants.strings.empty] = function(args, paper) {
+            JointGraphFactory.reloadGraph(paper.model);
+        };
+
+        builders[GBPConstants.strings.config] = function(args, paper) {
+            var storage = args.storage || 'config',
+                tenantId = args.tenantId;
+                
+       
+            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){
+                setOperConfigTopoData(paper, data);
+            }, function(){});
+        };
+
+        builders[GBPConstants.strings.oper] = function(args, paper) {
+            var storage = args.storage || 'config',
+                tenantId = args.tenantId;
+
+            TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){
+                setOperConfigTopoData(paper, data);
+            }, function(){});
+        };
+
+        builders[GBPConstants.strings.l2l3] = function(args, paper) {
+            var storage = args.storage || 'config',
+                tenantId = args.tenantId;
+
+            if(storage && tenantId) {
+                restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId);
+
+                restObj.get().then(function(data) {
+                    var createLinks = function(srcList, srcItems, dstItems) {
+                        var linkItems = srcList.map(function(srcObj) {
+                            var linkItem = null;
+                            if(srcObj.parent && dstItems[srcObj.parent]) {
+                                linkItem = JointGraphFactory.createLink(srcItems[srcObj.id].id, dstItems[srcObj.parent].id, 'blue');
+                            }
+                            return linkItem;
+                        }).filter(function(linkObj) {
+                            return linkObj !== null;
+                        });
+
+                        return linkItems;
+                    };
+
+                    var offsetObj = {
+                        ow: 100,
+                        oh: 100,
+                        w: 100,
+                        h: 100
+                    },
+                    marginObj = {
+                        w: 50,
+                        h: 80
+                    },
+                    itemsArray = {
+                        l3: {},
+                        l2bridge: {},
+                        l2flood: {},
+                        subnets: {}
+                    };
+
+                    JointGraphFactory.reloadGraph(paper.model);
+
+                    data.tenant[0]['l3-context'].forEach(function(c, i) {
+                        var label = c.name || c.id,
+                            header = 'L3 context',
+                            color = GBPConstants.colors[GBPConstants.strings.l3ctx],
+                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));
+                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.l3ctx , c, null, color, header);
+
+                        itemsArray.l3[c.id] = item;
+
+                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                        JointGraphFactory.addItem(paper.model, item);
+                    });
+
+                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100);
+
+                    data.tenant[0]['l2-bridge-domain'].forEach(function(c, i) {
+                        var label = c.name || c.id,
+                            header = 'L2 bridge domain',
+                            color = GBPConstants.colors[GBPConstants.strings.bridge],
+                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));
+                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.bridge , c, null, color, header);
+
+                        itemsArray.l2bridge[c.id] = item;
+
+                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                        JointGraphFactory.addItem(paper.model, item);
+                    });
+
+                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100);
+
+                    data.tenant[0]['l2-flood-domain'].forEach(function(c, i) {
+                        var label = c.name || c.id,
+                            header = 'L2 flood domain',
+                            color = GBPConstants.colors[GBPConstants.strings.flood],
+                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));
+                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.flood , c, null, color, header);
+
+                        itemsArray.l2flood[c.id] = item;
+
+                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                        JointGraphFactory.addItem(paper.model, item);
+                    });
+
+                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100);
+
+                    data.tenant[0]['subnet'].forEach(function(c, i) {
+                        var label = c.name || c.id,
+                            header = 'Subnet',
+                            color = GBPConstants.colors[GBPConstants.strings.subnet],
+                            width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length));
+                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.subnet , c, null, color, header);
+
+                        itemsArray.subnets[c.id] = item;
+
+                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);
+                        JointGraphFactory.addItem(paper.model, item);
+                    });
+
+                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.oh);
+
+                    var l2bridgeL3 = createLinks(data.tenant[0]['l2-bridge-domain'], itemsArray.l2bridge, itemsArray.l3);
+                    JointGraphFactory.addItemList(paper.model, l2bridgeL3);
+
+                    var l2floodL2bridge = createLinks(data.tenant[0]['l2-flood-domain'], itemsArray.l2flood, itemsArray.l2bridge);
+                    JointGraphFactory.addItemList(paper.model, l2floodL2bridge);
+
+                    var l2floodSubnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l2flood);
+                    JointGraphFactory.addItemList(paper.model, l2floodSubnet);
+
+                    var l2bridgeSubnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l2bridge);
+                    JointGraphFactory.addItemList(paper.model, l2bridgeSubnet);
+
+                    var l3Subnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l3);
+                    JointGraphFactory.addItemList(paper.model, l3Subnet);
+
+                }, function() {
+
+                });
+            }
+        };
+
+
+        return jgb;
+    });
 });
\ No newline at end of file
@@ -1,29 +1,29 @@
-<div ng-controller="actionRefCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section ng-show="internalView.actionRef">\r
-        <form name="actionRefForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            \r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel"><span>Name:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="actionRefForm.name.$error.required"></i>\r
-                </label>\r
-                <select class="form-control" ng-model="newActionRefObj.name" ng-options="c.name as getDisplayLabel(c, actionInstanceNames.labels) for c in actionInstanceNames.options" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newActionRefObj['order']">\r
-                <label class="block basicLabel"><span>Order:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newActionRefObj.order" ng-disabled="internalView.edit === 'view'" ng-change="validate(newActionRefObj.order, errors)"/>\r
-            </div>\r
-            \r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
+<div ng-controller="actionRefCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section ng-show="internalView.actionRef">
+        <form name="actionRefForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            
+            <div class="rowWrapper">
+                <label class="block basicLabel"><span>Name:</span>
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="actionRefForm.name.$error.required"></i>
+                </label>
+                <select class="form-control" ng-model="newActionRefObj.name" ng-options="c.name as getDisplayLabel(c, actionInstanceNames.labels) for c in actionInstanceNames.options" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newActionRefObj['order']">
+                <label class="block basicLabel"><span>Order:</span>
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newActionRefObj.order" ng-disabled="internalView.edit === 'view'" ng-change="validate(newActionRefObj.order, errors)"/>
+            </div>
+            
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>
+        </form>
+    </section>
+
 </div>
\ No newline at end of file
@@ -1,50 +1,50 @@
-<div ng-controller="actionsCtrl" ng-init="init()">\r
-    <h2 class="text-center">Actions</h2> \r
-\r
-<div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-     <section class="formWrapper clearfix" ng-show="actionsView">\r
-        <form name="actionsForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add actions</label>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name\r
-                    <i class="icon-exclamation-sign red" tooltip="{{actionsForm.name.$error.required ? 'Required field' : actionsForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="actionsForm.name.$error.required || actionsForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="name" ng-required="true" ng-model="newActionObj.name" ng-disabled="edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="edit === 'view' && !newActionObj['action-definition-id']">\r
-                <label class="block basicLabel">Definition</label>\r
-                <select class="form-control" ng-model="newActionObj['action-definition-id']" ng-options="d.id as getDisplayLabel(d, actionDefinitions.labels) for d in actionDefinitions.options" ng-disabled="edit === 'view'" ng-change="reloadDefs()">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <div ng-repeat="param in defs">\r
-                    <div class="row-param" ng-controller="paramCtrl" ng-init="init(param, newActionObj['parameter-value'])">\r
-                        <div ng-show="param.type !== 'range'">\r
-                            <label>{{ parameter.name + ' (' + parameter.type + ')' }}:</label>\r
-                            <input class="form-control" type="text" ng-model="value" ng-disabled="edit === 'view'"></input>\r
-                        </div>\r
-                        <div ng-show="param.type === 'range'">\r
-                            <label class="param-label">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>\r
-\r
-                            <input class="form-control narrow-input-left" type="text" ng-model="value.min" ng-disabled="edit === 'view'"></input>\r
-                            <input class="form-control narrow-input-right" type="text" ng-model="value.max" ng-disabled="edit === 'view'"></input>\r
-                        </div>\r
-                    </div>\r
-                </div>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-\r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
+<div ng-controller="actionsCtrl" ng-init="init()">
+    <h2 class="text-center">Actions</h2> 
+
+<div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+     <section class="formWrapper clearfix" ng-show="actionsView">
+        <form name="actionsForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add actions</label>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name
+                    <i class="icon-exclamation-sign red" tooltip="{{actionsForm.name.$error.required ? 'Required field' : actionsForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="actionsForm.name.$error.required || actionsForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" name="name" ng-required="true" ng-model="newActionObj.name" ng-disabled="edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="edit === 'view' && !newActionObj['action-definition-id']">
+                <label class="block basicLabel">Definition</label>
+                <select class="form-control" ng-model="newActionObj['action-definition-id']" ng-options="d.id as getDisplayLabel(d, actionDefinitions.labels) for d in actionDefinitions.options" ng-disabled="edit === 'view'" ng-change="reloadDefs()">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper">
+                <div ng-repeat="param in defs">
+                    <div class="row-param" ng-controller="paramCtrl" ng-init="init(param, newActionObj['parameter-value'])">
+                        <div ng-show="param.type !== 'range'">
+                            <label>{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+                            <input class="form-control" type="text" ng-model="value" ng-disabled="edit === 'view'"></input>
+                        </div>
+                        <div ng-show="param.type === 'range'">
+                            <label class="param-label">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+
+                            <input class="form-control narrow-input-left" type="text" ng-model="value.min" ng-disabled="edit === 'view'"></input>
+                            <input class="form-control narrow-input-right" type="text" ng-model="value.max" ng-disabled="edit === 'view'"></input>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="edit === 'view'">Save</button>
+        </form>
+    </section>
+
+
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
 </div>
\ No newline at end of file
@@ -1,41 +1,41 @@
-<div ng-controller="classifierRefCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-    \r
-    <section ng-show="internalView.classifierRef">\r
-        <form name="classifierRefForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel"><span>Name:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="{{classifierRefForm.name.$error.required ? 'Required field' : classifierRefForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="classifierRefForm.name.$error.required || classifierRefForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newClassifierRefObj.name" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-            \r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newClassifierRefObj['instance-name']">\r
-                <label class="block basicLabel"><span>Instance name:</span></label>\r
-                <select class="form-control" ng-model="newClassifierRefObj['instance-name']" ng-options="c.name as getDisplayLabel(c, instanceNames.labels) for c in instanceNames.options" ng-disabled="internalView.edit === 'view'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newClassifierRefObj['direction']">\r
-                <label class="block basicLabel"><span>Direction:</span></label>\r
-                <select class="form-control" ng-model="newClassifierRefObj.direction" ng-options="c for c in formDirections" ng-disabled="internalView.edit === 'view'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newClassifierRefObj['connection-tracking']">\r
-                <label class="block basicLabel"><span>Connection tracking:</span></label>\r
-                <select class="form-control" ng-model="newClassifierRefObj['connection-tracking']" ng-options="c for c in formConnectionTracking" ng-disabled="internalView.edit === 'view'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-            \r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
+<div ng-controller="classifierRefCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+    
+    <section ng-show="internalView.classifierRef">
+        <form name="classifierRefForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel"><span>Name:</span>
+                    <i class="icon-exclamation-sign red" tooltip="{{classifierRefForm.name.$error.required ? 'Required field' : classifierRefForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="classifierRefForm.name.$error.required || classifierRefForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newClassifierRefObj.name" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+            
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newClassifierRefObj['instance-name']">
+                <label class="block basicLabel"><span>Instance name:</span></label>
+                <select class="form-control" ng-model="newClassifierRefObj['instance-name']" ng-options="c.name as getDisplayLabel(c, instanceNames.labels) for c in instanceNames.options" ng-disabled="internalView.edit === 'view'">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newClassifierRefObj['direction']">
+                <label class="block basicLabel"><span>Direction:</span></label>
+                <select class="form-control" ng-model="newClassifierRefObj.direction" ng-options="c for c in formDirections" ng-disabled="internalView.edit === 'view'">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newClassifierRefObj['connection-tracking']">
+                <label class="block basicLabel"><span>Connection tracking:</span></label>
+                <select class="form-control" ng-model="newClassifierRefObj['connection-tracking']" ng-options="c for c in formConnectionTracking" ng-disabled="internalView.edit === 'view'">
+                    <option>--</option>
+                </select>
+            </div>
+            
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>
+        </form>
+    </section>
+
 </div>
\ No newline at end of file
@@ -1,54 +1,54 @@
-<div ng-controller="classifiersCtrl" ng-init="init()">\r
-    <h2 class="text-center">Classifiers</h2> \r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-     <section class="formWrapper clearfix" ng-show="classifiersView">\r
-        <form name="classifierForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add classifiers</label>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name\r
-                    <i class="icon-exclamation-sign red" tooltip="{{classifierForm.name.$error.required ? 'Required field' : classifierForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="classifierForm.name.$error.required || classifierForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="name" ng-required="true" ng-model="newClassifierObj.name" ng-disabled="edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="edit === 'view' && !newClassifierObj['classifier-definition-id']">\r
-                <label class="block basicLabel">Definition</label>\r
-                <select class="form-control" ng-model="newClassifierObj['classifier-definition-id']" ng-options="d.id as getDisplayLabel(d, classifierDefinitions.labels) for d in classifierDefinitions.options" ng-change="reloadDefs()" ng-disabled="edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-        <div class="rowWrapper clearfix">\r
-                <div ng-repeat="param in defs">\r
-                <div class="rowWrapper" ng-controller="paramCtrl" ng-init="init(param, newClassifierObj['parameter-value'])">\r
-                        <div ng-show="param.type !== 'range'">\r
-                        <label class="block basicLabel">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>\r
-                            <input class="form-control" type="text" ng-model="value" ng-disabled="edit === 'view'"></input>\r
-                        </div>\r
-                        <div ng-show="param.type === 'range'">\r
-                        <label class="block basicLabel">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>\r
-\r
-                        <div class="col-md-6 inputWrapper leftInput">\r
-                            <input class="form-control" type="text" ng-model="value.min" ng-disabled="edit === 'view'"></input>\r
-                        </div>\r
-                        <div class="col-md-6 inputWrapper rightInput">\r
-                            <input class="form-control col-md-6" type="text" ng-model="value.max" ng-disabled="edit === 'view'"></input>\r
-                        </div>\r
-\r
-                        </div>\r
-                    </div>\r
-                </div>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-    \r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
+<div ng-controller="classifiersCtrl" ng-init="init()">
+    <h2 class="text-center">Classifiers</h2> 
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+     <section class="formWrapper clearfix" ng-show="classifiersView">
+        <form name="classifierForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add classifiers</label>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name
+                    <i class="icon-exclamation-sign red" tooltip="{{classifierForm.name.$error.required ? 'Required field' : classifierForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="classifierForm.name.$error.required || classifierForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" name="name" ng-required="true" ng-model="newClassifierObj.name" ng-disabled="edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="edit === 'view' && !newClassifierObj['classifier-definition-id']">
+                <label class="block basicLabel">Definition</label>
+                <select class="form-control" ng-model="newClassifierObj['classifier-definition-id']" ng-options="d.id as getDisplayLabel(d, classifierDefinitions.labels) for d in classifierDefinitions.options" ng-change="reloadDefs()" ng-disabled="edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+        <div class="rowWrapper clearfix">
+                <div ng-repeat="param in defs">
+                <div class="rowWrapper" ng-controller="paramCtrl" ng-init="init(param, newClassifierObj['parameter-value'])">
+                        <div ng-show="param.type !== 'range'">
+                        <label class="block basicLabel">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+                            <input class="form-control" type="text" ng-model="value" ng-disabled="edit === 'view'"></input>
+                        </div>
+                        <div ng-show="param.type === 'range'">
+                        <label class="block basicLabel">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+
+                        <div class="col-md-6 inputWrapper leftInput">
+                            <input class="form-control" type="text" ng-model="value.min" ng-disabled="edit === 'view'"></input>
+                        </div>
+                        <div class="col-md-6 inputWrapper rightInput">
+                            <input class="form-control col-md-6" type="text" ng-model="value.max" ng-disabled="edit === 'view'"></input>
+                        </div>
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="edit === 'view'">Save</button>
+        </form>
+    </section>
+    
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
 </div>
\ No newline at end of file
@@ -1,46 +1,46 @@
-<div ng-controller="contractCtrl" ng-init="init()">\r
-\r
-    <h2 class="text-center">Contracts</h2> \r
-\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="internalView.contract">\r
-        <i class="icon-remove align-right" ng-click="close()"></i>\r
-        <label class="block">Add contract</label>\r
-\r
-        <div class="rowWrapper">\r
-            <label class="block basicLabel"><span>Id:</span></label>\r
-            <input class="form-control" type="text" ng-model="newContractObj.id" disabled/>\r
-        </div>\r
-\r
-        <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newContractObj['description']">\r
-            <label class="block basicLabel"><span>Description:</span></label>\r
-            <input class="form-control" type="text" ng-model="newContractObj.description" ng-disabled="internalView.edit === 'view'"/>\r
-        </div>\r
-\r
-        <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newContractObj['parent']">\r
-            <label class="block basicLabel"><span>Parent:</span></label>\r
-            <select class="form-control" ng-model="newContractObj.parent" ng-options="d.id as getDisplayLabel(d, displayLabel) for d in list" ng-disabled="internalView.edit === 'view'">\r
-                <option>--</option>\r
-            </select>\r
-        </div>\r
-\r
-        <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedContract">\r
-        <div ng-include src="view_path+'clause.tpl.html'"></div>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedContract">\r
-        <div ng-include src="view_path+'subjects.tpl.html'"></div>\r
-    </section>\r
-\r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
-\r
-</div>\r
-\r
-\r
+<div ng-controller="contractCtrl" ng-init="init()">
+
+    <h2 class="text-center">Contracts</h2> 
+
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="internalView.contract">
+        <i class="icon-remove align-right" ng-click="close()"></i>
+        <label class="block">Add contract</label>
+
+        <div class="rowWrapper">
+            <label class="block basicLabel"><span>Id:</span></label>
+            <input class="form-control" type="text" ng-model="newContractObj.id" disabled/>
+        </div>
+
+        <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newContractObj['description']">
+            <label class="block basicLabel"><span>Description:</span></label>
+            <input class="form-control" type="text" ng-model="newContractObj.description" ng-disabled="internalView.edit === 'view'"/>
+        </div>
+
+        <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newContractObj['parent']">
+            <label class="block basicLabel"><span>Parent:</span></label>
+            <select class="form-control" ng-model="newContractObj.parent" ng-options="d.id as getDisplayLabel(d, displayLabel) for d in list" ng-disabled="internalView.edit === 'view'">
+                <option>--</option>
+            </select>
+        </div>
+
+        <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedContract">
+        <div ng-include src="view_path+'clause.tpl.html'"></div>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedContract">
+        <div ng-include src="view_path+'subjects.tpl.html'"></div>
+    </section>
+
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
+
+</div>
+
+
old mode 100755 (executable)
new mode 100644 (file)
similarity index 98%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/views/docs.tpl.html
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/docs.tpl.html
index 9f69ee8..4b16089
@@ -1,5 +1,5 @@
-<div>\r
-    <h2 class="text-center">Docs</h2> \r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpanded('basic')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="toggleExpanded('policy')">Up</button>\r
-</div>\r
+<div>
+    <h2 class="text-center">Docs</h2> 
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpanded('basic')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="toggleExpanded('policy')">Up</button>
+</div>
-<div ng-controller="endpointCtrl" ng-init="init()">\r
-\r
-    <h2 class="text-center">Endpoint</h2> \r
-\r
-    <div ng-include src="view_path+'parts/crud-endpoint.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.endpoint">\r
-        <form name="endpointForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['network-containment']">\r
-                <label class="block basicLabel">Network containment:</label>\r
-                <select class="form-control" ng-model="newEndpointObj['network-containment']" ng-options="c.id as getDisplayLabel(c, networkContainment.labels) for c in networkContainment.options | orderBy:'name'" ng-disabled="view.edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-group']">\r
-                <label class="block basicLabel">Endpoint group:</label>\r
-                <select class="form-control" ng-model="newEndpointObj['endpoint-group']"  ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-groups']">\r
-                <label class="basicLabel">Endpoint groups:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="epGroups in newEndpointObj['endpoint-groups'] track by $index">\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <select class="form-control" ng-model="epGroups"  ng-change="updateLeafListEl($index, epGroups, 'endpoint-groups')" ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">\r
-                                <option value="">Select option</option>\r
-                            </select>\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['condition']">\r
-                <label class="basicLabel">Condition:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('condition')" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="condition in newEndpointObj['condition'] track by $index">\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <input class="form-control" type="text" ng-model="condition" ng-change="updateLeafListEl($index, condition, 'condition')" ng-disabled="view.edit === 'view'"/>\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'condition')" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="rowWrapper clearfix">\r
-                <label class="block basicLabel">L2 context:\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="endpointForm.l2context.$error.required"></i>\r
-                </label>\r
-                <select class="form-control" ng-model="newEndpointObj['l2-context']" name="l2context" ng-required="true" ng-options="c.id as getDisplayLabel(c, l2context.labels) for c in l2context.options" ng-disabled="view.edit !== 'add'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper clearfix">\r
-                <label class="block basicLabel">MAC Address:\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="endpointForm.macAddress.$error.pattern"></i>\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="endpointForm.macAddress.$error.required"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="macAddress" ng-model="newEndpointObj['mac-address']" ng-pattern="/^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})$/" ng-required="true" ng-disabled="view.edit !== 'add'"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['l3-address']">\r
-                <label class="basicLabel">L3 Address:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewL3address()" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="l3address in newEndpointObj['l3-address'] track by $index">\r
-                    <div class="separator col-md-11">\r
-                        <div class="inner-separator"></div>\r
-                    </div>\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <label class="block basicLabel">L3 Context:</label>\r
-                            <select class="form-control" ng-model="l3address['l3-context']" ng-options="c.id as getDisplayLabel(c, l3context.labels) for c in l3context.options" ng-disabled="view.edit === 'view'">\r
-                                <option value="">Select option</option>\r
-                            </select>\r
-                        </div>\r
-\r
-                        <div class="rowWrapper">\r
-                            <label class="block basicLabel">IP Address:\r
-                                <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="endpointForm.ipAddress.$error.pattern"></i>\r
-                                <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="endpointForm.ipAddress.$error.required"></i>\r
-                            </label>\r
-                            <input class="form-control" type="text" ng-model="l3address['ip-address']" name="ipAddress" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/" ng-required="l3address['l3-context']" ng-disabled="view.edit === 'view'"/>\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2 btn-list" ng-click="deleteNewL3address($index)" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
-\r
+<div ng-controller="endpointCtrl" ng-init="init()">
+
+    <h2 class="text-center">Endpoint</h2> 
+
+    <div ng-include src="view_path+'parts/crud-endpoint.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.endpoint">
+        <form name="endpointForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['network-containment']">
+                <label class="block basicLabel">Network containment:</label>
+                <select class="form-control" ng-model="newEndpointObj['network-containment']" ng-options="c.id as getDisplayLabel(c, networkContainment.labels) for c in networkContainment.options | orderBy:'name'" ng-disabled="view.edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-group']">
+                <label class="block basicLabel">Endpoint group:</label>
+                <select class="form-control" ng-model="newEndpointObj['endpoint-group']"  ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-groups']">
+                <label class="basicLabel">Endpoint groups:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="epGroups in newEndpointObj['endpoint-groups'] track by $index">
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <select class="form-control" ng-model="epGroups"  ng-change="updateLeafListEl($index, epGroups, 'endpoint-groups')" ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">
+                                <option value="">Select option</option>
+                            </select>
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['condition']">
+                <label class="basicLabel">Condition:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('condition')" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="condition in newEndpointObj['condition'] track by $index">
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <input class="form-control" type="text" ng-model="condition" ng-change="updateLeafListEl($index, condition, 'condition')" ng-disabled="view.edit === 'view'"/>
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'condition')" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <div class="rowWrapper clearfix">
+                <label class="block basicLabel">L2 context:
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="endpointForm.l2context.$error.required"></i>
+                </label>
+                <select class="form-control" ng-model="newEndpointObj['l2-context']" name="l2context" ng-required="true" ng-options="c.id as getDisplayLabel(c, l2context.labels) for c in l2context.options" ng-disabled="view.edit !== 'add'">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper clearfix">
+                <label class="block basicLabel">MAC Address:
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="endpointForm.macAddress.$error.pattern"></i>
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="endpointForm.macAddress.$error.required"></i>
+                </label>
+                <input class="form-control" type="text" name="macAddress" ng-model="newEndpointObj['mac-address']" ng-pattern="/^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})$/" ng-required="true" ng-disabled="view.edit !== 'add'"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['l3-address']">
+                <label class="basicLabel">L3 Address:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewL3address()" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="l3address in newEndpointObj['l3-address'] track by $index">
+                    <div class="separator col-md-11">
+                        <div class="inner-separator"></div>
+                    </div>
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <label class="block basicLabel">L3 Context:</label>
+                            <select class="form-control" ng-model="l3address['l3-context']" ng-options="c.id as getDisplayLabel(c, l3context.labels) for c in l3context.options" ng-disabled="view.edit === 'view'">
+                                <option value="">Select option</option>
+                            </select>
+                        </div>
+
+                        <div class="rowWrapper">
+                            <label class="block basicLabel">IP Address:
+                                <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="endpointForm.ipAddress.$error.pattern"></i>
+                                <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="endpointForm.ipAddress.$error.required"></i>
+                            </label>
+                            <input class="form-control" type="text" ng-model="l3address['ip-address']" name="ipAddress" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/" ng-required="l3address['l3-context']" ng-disabled="view.edit === 'view'"/>
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2 btn-list" ng-click="deleteNewL3address($index)" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>
+        </form>
+    </section>
+
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
+
 </div>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
similarity index 98%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/views/epg.tpl.html
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/epg.tpl.html
index c59507e..303e929
@@ -1,64 +1,64 @@
-<div ng-controller="epgCtrl" ng-init="init()">\r
-    <h2 class="text-center">Endpoint groups</h2>\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="internalView.epg">\r
-        <form name="epgForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Id:</label>\r
-                <input class="form-control" type="text" ng-model="newEpgObj.id" ng-disabled="internalView.edit !== 'add'"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['name']">\r
-                <label class="block basicLabel">Name:\r
-                    <i class="icon-exclamation-sign red" tooltip="{{epgForm.name.$error.required ? 'Required field' : epgForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="epgForm.name.$error.required || epgForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="name" ng-model="newEpgObj.name" ng-required="true" ng-disabled="internalView.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['description']">\r
-                <label class="block basicLabel">Description:</label>\r
-                <input class="form-control" type="text" ng-model="newEpgObj.description" ng-disabled="internalView.edit === 'view'"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['intra-group-policy']">\r
-                <label class="block basicLabel">Intra group policy:</label>\r
-                <select class="form-control" ng-model="newEpgObj['intra-group-policy']" ng-options="opt for opt in igpOpts" ng-disabled="internalView.edit === 'view'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['network-domain']">\r
-                <label class="block basicLabel">Network domain:\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="epgForm.netDomain.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newEpgObj['network-domain']" name="netDomain" ng-pattern="/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/" ng-disabled="internalView.edit === 'view'"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['parent']">\r
-                <label class="block basicLabel">Parent:</label>\r
-                <select class="form-control" ng-model="newEpgObj.parent" ng-options="d.id as getDisplayLabel(d, displayLabel) for d in list">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedEpg">\r
-        <div ng-include src="view_path+'cns.tpl.html'"></div>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedEpg">\r
-        <div ng-include src="view_path+'pns.tpl.html'"></div>\r
-    </section>\r
-\r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
-\r
+<div ng-controller="epgCtrl" ng-init="init()">
+    <h2 class="text-center">Endpoint groups</h2>
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="internalView.epg">
+        <form name="epgForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Id:</label>
+                <input class="form-control" type="text" ng-model="newEpgObj.id" ng-disabled="internalView.edit !== 'add'"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['name']">
+                <label class="block basicLabel">Name:
+                    <i class="icon-exclamation-sign red" tooltip="{{epgForm.name.$error.required ? 'Required field' : epgForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="epgForm.name.$error.required || epgForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" name="name" ng-model="newEpgObj.name" ng-required="true" ng-disabled="internalView.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['description']">
+                <label class="block basicLabel">Description:</label>
+                <input class="form-control" type="text" ng-model="newEpgObj.description" ng-disabled="internalView.edit === 'view'"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['intra-group-policy']">
+                <label class="block basicLabel">Intra group policy:</label>
+                <select class="form-control" ng-model="newEpgObj['intra-group-policy']" ng-options="opt for opt in igpOpts" ng-disabled="internalView.edit === 'view'">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['network-domain']">
+                <label class="block basicLabel">Network domain:
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="epgForm.netDomain.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newEpgObj['network-domain']" name="netDomain" ng-pattern="/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/" ng-disabled="internalView.edit === 'view'"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newEpgObj['parent']">
+                <label class="block basicLabel">Parent:</label>
+                <select class="form-control" ng-model="newEpgObj.parent" ng-options="d.id as getDisplayLabel(d, displayLabel) for d in list">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>
+        </form>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedEpg">
+        <div ng-include src="view_path+'cns.tpl.html'"></div>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedEpg">
+        <div ng-include src="view_path+'pns.tpl.html'"></div>
+    </section>
+
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
+
 </div>
\ No newline at end of file
@@ -1,58 +1,58 @@
-<section class="col-md-3 simpleBox mt30">\r
-    <h3 class="text-center">Health</h3>\r
-    <div class="panelWrapper clearfix">\r
-        <button class="btn btn-primary col-md-12 btn-lg">Exception</button>\r
-        <button class="btn btn-primary col-md-12 btn-lg">Conflict</button>\r
-    </div>\r
-</section>\r
-\r
-<section class="col-md-4 col-md-offset-2 simpleBox mt30">\r
-    <div class="panelWrapper clearfix">\r
-        <!-- Tenants list -->\r
-        <div class="rowWrapper clearfix">\r
-            <label class="block"><span>Tenants list</span></label>\r
-            <div class="selectWrapper col-md-12">\r
-                <select class="form-control" ng-model="selectedTenant" ng-change="setTenant(selectedTenant)" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in tenantList">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="clear"></div>\r
-\r
-            <div class="mt10 clearfix">\r
-                <div class="col-md-6 pl0">\r
-                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpanded('expressed-policy'); setViewExpand('subMenuView','governance', true); setBreadcrumb('l2', 'Expressed policy', true);" >Expressed<br />policy</button>\r
-                </div>\r
-                <div class="col-md-6 pr0">\r
-                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpanded('delivered-policy'); setViewExpand('subMenuView','governance', true); setBreadcrumb('l2', 'Delivered policy', true);">Delivered<br />policy</button>\r
-                </div>\r
-            </div>\r
-            \r
-        </div>\r
-    </div>\r
-\r
-\r
-    <div class="panelWrapper clearfix">\r
-        <!-- Tenants list -->\r
-        <div class="rowWrapper clearfix">\r
-            <label class="block"><span>Renderers list</span></label>\r
-            <div class="selectWrapper col-md-12">\r
-                <select class="form-control" ng-model="selectedRenderer" ng-change="setRenderer()" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in rendererList">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="clear"></div>\r
-\r
-            <div class="mt10 clearfix">\r
-                <div class="col-md-6 pl0">\r
-                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView', 'renderers', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);" >Renderer<br />configuration</button>\r
-                </div>\r
-                <div class="col-md-6 pr0">\r
-                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpanded('renderer-state'); setBreadcrumb('l1', 'Governance', true); setBreadcrumb('l2', 'Renderer state', true);">Renderer<br />state</button>\r
-                </div>\r
-            </div>\r
-\r
-        </div>\r
-    </div>\r
+<section class="col-md-3 simpleBox mt30">
+    <h3 class="text-center">Health</h3>
+    <div class="panelWrapper clearfix">
+        <button class="btn btn-primary col-md-12 btn-lg">Exception</button>
+        <button class="btn btn-primary col-md-12 btn-lg">Conflict</button>
+    </div>
+</section>
+
+<section class="col-md-4 col-md-offset-2 simpleBox mt30">
+    <div class="panelWrapper clearfix">
+        <!-- Tenants list -->
+        <div class="rowWrapper clearfix">
+            <label class="block"><span>Tenants list</span></label>
+            <div class="selectWrapper col-md-12">
+                <select class="form-control" ng-model="selectedTenant" ng-change="setTenant(selectedTenant)" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in tenantList">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="clear"></div>
+
+            <div class="mt10 clearfix">
+                <div class="col-md-6 pl0">
+                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpanded('expressed-policy'); setViewExpand('subMenuView','governance', true); setBreadcrumb('l2', 'Expressed policy', true);" >Expressed<br />policy</button>
+                </div>
+                <div class="col-md-6 pr0">
+                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpanded('delivered-policy'); setViewExpand('subMenuView','governance', true); setBreadcrumb('l2', 'Delivered policy', true);">Delivered<br />policy</button>
+                </div>
+            </div>
+            
+        </div>
+    </div>
+
+
+    <div class="panelWrapper clearfix">
+        <!-- Tenants list -->
+        <div class="rowWrapper clearfix">
+            <label class="block"><span>Renderers list</span></label>
+            <div class="selectWrapper col-md-12">
+                <select class="form-control" ng-model="selectedRenderer" ng-change="setRenderer()" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in rendererList">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="clear"></div>
+
+            <div class="mt10 clearfix">
+                <div class="col-md-6 pl0">
+                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView', 'renderers', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);" >Renderer<br />configuration</button>
+                </div>
+                <div class="col-md-6 pr0">
+                    <button class="btn btn-primary col-md-12 btn-big" ng-click="toggleExpanded('renderer-state'); setBreadcrumb('l1', 'Governance', true); setBreadcrumb('l2', 'Renderer state', true);">Renderer<br />state</button>
+                </div>
+            </div>
+
+        </div>
+    </div>
 </section>
\ No newline at end of file
@@ -1,37 +1,37 @@
-<div ng-controller="layerCtrl" ng-init="init(key,value)" class="{{ checkData(value, 'Object') ? 'customContainer' : '' }}">\r
-\r
-    <div ng-if="checkData(value, 'Object')" class="topContainerPart">\r
-        <span class="treeBullet containerBullet" ng-if="key !== 'subject-feature-definitions'">&#8226;</span>\r
-        <button class="yangButton {{ expanded ? 'iconArrowDown' : 'iconArrowRight' }} inlineBlock" tooltip="Show / Hide container" ng-click='toggleExpanded()'></button>\r
-        <button class="btn-name btn-slim">\r
-            {{key}}\r
-        </button>\r
-\r
-        <div ng-if="checkData(data, 'Array')" class="listPagination inlineBlock" ng-show="data.length > 0">\r
-            <button ng-click="shiftDisplayPrev()" ng-show="showPrevButton()" tooltip="Show previous item" class="yangButton iconPrev"></button>\r
-            <div class="paginationItemWrapper">\r
-                <button ng-repeat="offset in displayOffsets track by $index" ng-if="currentDisplayIndex + offset > -1 && data.length > currentDisplayIndex + offset" class="btn  btn-like-tab {{ (data[currentDisplayIndex + offset] === actSelected ? 'btn-selected':'') }}" ng-click="setActData(data[currentDisplayIndex + offset])" tooltip="Select this node">\r
-                    {{ data[currentDisplayIndex + offset].name }}\r
-                </button>\r
-            </div>\r
-            <button ng-click="shiftDisplayNext()"  ng-show="showNextButton('listData')" tooltip="Show next item" class="yangButton iconNext"></button>\r
-        </div>\r
-    </div>\r
-\r
-    <div class="leaf" ng-if="!checkData(value, 'Object') && !checkData(value, 'Array')">\r
-        <span class="treeBullet" ng-if="key !== 'subject-feature-definitions'">&#8226;</span>\r
-        <span class="leaf-label col-md-2">\r
-            {{ key }}\r
-        </span>\r
-        <span class="leaf-label col-md-9"><strong>{{value}}</strong></span>\r
-        <div class="clear"></div>\r
-    </div>\r
-\r
-    <div ng-if="checkData(data, 'Array')" ng-repeat="(key, value) in actSelected track by $index" ng-include src="view_path+'/node-structure.tpl.html'" ng-show="expanded">\r
-    </div>\r
-\r
-    <div ng-if="!checkData(data, 'Array') && checkData(data, 'Object')" ng-repeat="(key, value) in data track by $index" ng-include src="view_path+'/node-structure.tpl.html'" ng-show="expanded">\r
-    </div>\r
-\r
-    <i class="icon-caret-down borderArrow"></i>\r
+<div ng-controller="layerCtrl" ng-init="init(key,value)" class="{{ checkData(value, 'Object') ? 'customContainer' : '' }}">
+
+    <div ng-if="checkData(value, 'Object')" class="topContainerPart">
+        <span class="treeBullet containerBullet" ng-if="key !== 'subject-feature-definitions'">&#8226;</span>
+        <button class="yangButton {{ expanded ? 'iconArrowDown' : 'iconArrowRight' }} inlineBlock" tooltip="Show / Hide container" ng-click='toggleExpanded()'></button>
+        <button class="btn-name btn-slim">
+            {{key}}
+        </button>
+
+        <div ng-if="checkData(data, 'Array')" class="listPagination inlineBlock" ng-show="data.length > 0">
+            <button ng-click="shiftDisplayPrev()" ng-show="showPrevButton()" tooltip="Show previous item" class="yangButton iconPrev"></button>
+            <div class="paginationItemWrapper">
+                <button ng-repeat="offset in displayOffsets track by $index" ng-if="currentDisplayIndex + offset > -1 && data.length > currentDisplayIndex + offset" class="btn  btn-like-tab {{ (data[currentDisplayIndex + offset] === actSelected ? 'btn-selected':'') }}" ng-click="setActData(data[currentDisplayIndex + offset])" tooltip="Select this node">
+                    {{ data[currentDisplayIndex + offset].name }}
+                </button>
+            </div>
+            <button ng-click="shiftDisplayNext()"  ng-show="showNextButton('listData')" tooltip="Show next item" class="yangButton iconNext"></button>
+        </div>
+    </div>
+
+    <div class="leaf" ng-if="!checkData(value, 'Object') && !checkData(value, 'Array')">
+        <span class="treeBullet" ng-if="key !== 'subject-feature-definitions'">&#8226;</span>
+        <span class="leaf-label col-md-2">
+            {{ key }}
+        </span>
+        <span class="leaf-label col-md-9"><strong>{{value}}</strong></span>
+        <div class="clear"></div>
+    </div>
+
+    <div ng-if="checkData(data, 'Array')" ng-repeat="(key, value) in actSelected track by $index" ng-include src="view_path+'/node-structure.tpl.html'" ng-show="expanded">
+    </div>
+
+    <div ng-if="!checkData(data, 'Array') && checkData(data, 'Object')" ng-repeat="(key, value) in data track by $index" ng-include src="view_path+'/node-structure.tpl.html'" ng-show="expanded">
+    </div>
+
+    <i class="icon-caret-down borderArrow"></i>
 </div>
\ No newline at end of file
@@ -1,7 +1,7 @@
-<section class="col-md-9 col-md-offset-2 simpleBox mt30">\r
-    <div ng-controller="rendererStateCtrl">\r
-        <div ng-if="!checkData(data, 'Array')" ng-repeat="(key, value) in data" ng-include src="view_path+'/node-structure.tpl.html'">\r
-        </div>\r
-    </div>\r
-</section>\r
-\r
+<section class="col-md-9 col-md-offset-2 simpleBox mt30">
+    <div ng-controller="rendererStateCtrl">
+        <div ng-if="!checkData(data, 'Array')" ng-repeat="(key, value) in data" ng-include src="view_path+'/node-structure.tpl.html'">
+        </div>
+    </div>
+</section>
+
old mode 100755 (executable)
new mode 100644 (file)
similarity index 97%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/index.tpl.html
index d52f902..707af51
@@ -1,10 +1,10 @@
-<section class="gbpWrapper clearfix">\r
-\r
-    <section class="mainNavigationWrapper" ng-show="mainView.main" ng-include src="view_path+'main/main.tpl.html'"></section>\r
-    <section ng-show="mainView.governance" ng-include src="view_path+'main/governance.tpl.html'"></section>\r
-    <section ng-show="mainView['policy-renderer']" ng-include src="view_path+'main/policy-renderer.tpl.html'"></section>\r
-</section>\r
-\r
-\r
-\r
-\r
+<section class="gbpWrapper clearfix">
+
+    <section class="mainNavigationWrapper" ng-show="mainView.main" ng-include src="view_path+'main/main.tpl.html'"></section>
+    <section ng-show="mainView.governance" ng-include src="view_path+'main/governance.tpl.html'"></section>
+    <section ng-show="mainView['policy-renderer']" ng-include src="view_path+'main/policy-renderer.tpl.html'"></section>
+</section>
+
+
+
+
old mode 100755 (executable)
new mode 100644 (file)
similarity index 98%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/views/l2l3.tpl.html
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/l2l3.tpl.html
index 11a676b..648b2f0
-<div ng-controller="l3ContextCtrl" ng-init="init()">\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.l3context">\r
-        <form name="l3ContextForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add L3 Context</label>\r
-\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Id:</label>\r
-                <input class="form-control" type="text" ng-model="newL3ContextObj.id" disabled />\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name:\r
-                    <i class="icon-exclamation-sign red" tooltip="{{l3ContextForm.name.$error.required ? 'Required field' : l3ContextForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="l3ContextForm.name.$error.required || l3ContextForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newL3ContextObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL3ContextObj.description">\r
-                <label class="block basicLabel">Description:</label>\r
-                <input class="form-control" type="text" ng-model="newL3ContextObj.description" ng-disabled="view.edit === 'view'" />\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-</div>\r
-\r
-<br/><br/>\r
-\r
-<div ng-controller="l2BridgeCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.l2bridge">\r
-        <form name="l2BridgeForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add L2 Bridge Domain</label>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Id:</label>\r
-                <input class="form-control" type="text" ng-model="newL2BridgeObj.id" disabled />\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name:\r
-                    <i class="icon-exclamation-sign red" tooltip="{{l2BridgeForm.name.$error.required ? 'Required field' : l2BridgeForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="l2BridgeForm.name.$error.required || l2BridgeForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newL2BridgeObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2BridgeObj.description">\r
-                <label class="block basicLabel">Description:</label>\r
-                <input class="form-control" type="text" ng-model="newL2BridgeObj.description" ng-disabled="view.edit === 'view'" />\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2BridgeObj.parent">\r
-                <label class="block basicLabel">Parent:</label>\r
-                <select class="form-control" ng-model="newL2BridgeObj.parent" ng-options="d.id as getDisplayLabel(d, l3context.labels) for d in l3context.options" ng-disabled="view.edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-</div>\r
-\r
-<br/><br/>\r
-\r
-<div ng-controller="l2FloodCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.l2flood">\r
-        <form name="l2FloodForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add L2 Flood Domain</label>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Id:</label>\r
-                <input class="form-control" type="text" ng-model="newL2FloodObj.id" disabled />\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name:\r
-                    <i class="icon-exclamation-sign red" tooltip="{{l2FloodForm.name.$error.required ? 'Required field' : l2FloodForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="l2FloodForm.name.$error.required || l2FloodForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newL2FloodObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2FloodObj.description">\r
-                <label class="block basicLabel">Description:</label>\r
-                <input class="form-control" type="text" ng-model="newL2FloodObj.description" ng-disabled="view.edit === 'view'" />\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2FloodObj.parent">\r
-                <label class="block basicLabel">Parent:</label>\r
-                <select class="form-control" ng-model="newL2FloodObj.parent" ng-options="d.id as getDisplayLabel(d, l2bridge.labels) for d in l2bridge.options" ng-disabled="view.edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-</div>\r
-\r
-<br/><br/>\r
-\r
-<div ng-controller="subnetCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.subnet">\r
-        <form name="subnetForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add Subnet</label>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Id:</label>\r
-                <input class="form-control" type="text" ng-model="newSubnetObj.id" disabled />\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name:\r
-                    <i class="icon-exclamation-sign red" tooltip="{{subnetForm.name.$error.required ? 'Required field' : subnetForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="subnetForm.name.$error.required || subnetForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newSubnetObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj.description">\r
-                <label class="block basicLabel">Description:</label>\r
-                <input class="form-control" type="text" ng-model="newSubnetObj.description" ng-disabled="view.edit === 'view'"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj.parent">\r
-                <label class="block basicLabel">Parent:</label>\r
-                <select class="form-control" ng-model="newSubnetObj.parent" ng-options="d.id as getDisplayLabel(d, l2L3List.labels) for d in l2L3List.options" ng-disabled="view.edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj['ip-prefix']">\r
-                <label class="block basicLabel">IP prefix:\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="subnetForm.ipPrefix.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newSubnetObj['ip-prefix']" name="ipPrefix" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))$/" ng-disabled="view.edit === 'view'" />\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj['virtual-router-ip']">\r
-                <label class="block basicLabel">Virtual router:\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="subnetForm.virtualRouter.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newSubnetObj['virtual-router-ip']" name="virtualRouter" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?$/"\r
-                ng-model="newSubnetObj['virtual-router-ip']" ng-disabled="view.edit === 'view'" />\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedSubnet">\r
-        <div ng-include src="view_path+'gateway.tpl.html'"></div>\r
-    </section>\r
-\r
-    <div class="formWrapper clearfix">\r
-        <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-        <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-        <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
-    </div>\r
+<div ng-controller="l3ContextCtrl" ng-init="init()">
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.l3context">
+        <form name="l3ContextForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add L3 Context</label>
+
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Id:</label>
+                <input class="form-control" type="text" ng-model="newL3ContextObj.id" disabled />
+            </div>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name:
+                    <i class="icon-exclamation-sign red" tooltip="{{l3ContextForm.name.$error.required ? 'Required field' : l3ContextForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="l3ContextForm.name.$error.required || l3ContextForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newL3ContextObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL3ContextObj.description">
+                <label class="block basicLabel">Description:</label>
+                <input class="form-control" type="text" ng-model="newL3ContextObj.description" ng-disabled="view.edit === 'view'" />
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>
+        </form>
+    </section>
+</div>
+
+<br/><br/>
+
+<div ng-controller="l2BridgeCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.l2bridge">
+        <form name="l2BridgeForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add L2 Bridge Domain</label>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Id:</label>
+                <input class="form-control" type="text" ng-model="newL2BridgeObj.id" disabled />
+            </div>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name:
+                    <i class="icon-exclamation-sign red" tooltip="{{l2BridgeForm.name.$error.required ? 'Required field' : l2BridgeForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="l2BridgeForm.name.$error.required || l2BridgeForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newL2BridgeObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2BridgeObj.description">
+                <label class="block basicLabel">Description:</label>
+                <input class="form-control" type="text" ng-model="newL2BridgeObj.description" ng-disabled="view.edit === 'view'" />
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2BridgeObj.parent">
+                <label class="block basicLabel">Parent:</label>
+                <select class="form-control" ng-model="newL2BridgeObj.parent" ng-options="d.id as getDisplayLabel(d, l3context.labels) for d in l3context.options" ng-disabled="view.edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>
+        </form>
+    </section>
+</div>
+
+<br/><br/>
+
+<div ng-controller="l2FloodCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.l2flood">
+        <form name="l2FloodForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add L2 Flood Domain</label>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Id:</label>
+                <input class="form-control" type="text" ng-model="newL2FloodObj.id" disabled />
+            </div>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name:
+                    <i class="icon-exclamation-sign red" tooltip="{{l2FloodForm.name.$error.required ? 'Required field' : l2FloodForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="l2FloodForm.name.$error.required || l2FloodForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newL2FloodObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2FloodObj.description">
+                <label class="block basicLabel">Description:</label>
+                <input class="form-control" type="text" ng-model="newL2FloodObj.description" ng-disabled="view.edit === 'view'" />
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newL2FloodObj.parent">
+                <label class="block basicLabel">Parent:</label>
+                <select class="form-control" ng-model="newL2FloodObj.parent" ng-options="d.id as getDisplayLabel(d, l2bridge.labels) for d in l2bridge.options" ng-disabled="view.edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>
+        </form>
+    </section>
+</div>
+
+<br/><br/>
+
+<div ng-controller="subnetCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.subnet">
+        <form name="subnetForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add Subnet</label>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Id:</label>
+                <input class="form-control" type="text" ng-model="newSubnetObj.id" disabled />
+            </div>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name:
+                    <i class="icon-exclamation-sign red" tooltip="{{subnetForm.name.$error.required ? 'Required field' : subnetForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="subnetForm.name.$error.required || subnetForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newSubnetObj.name" name="name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj.description">
+                <label class="block basicLabel">Description:</label>
+                <input class="form-control" type="text" ng-model="newSubnetObj.description" ng-disabled="view.edit === 'view'"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj.parent">
+                <label class="block basicLabel">Parent:</label>
+                <select class="form-control" ng-model="newSubnetObj.parent" ng-options="d.id as getDisplayLabel(d, l2L3List.labels) for d in l2L3List.options" ng-disabled="view.edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj['ip-prefix']">
+                <label class="block basicLabel">IP prefix:
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="subnetForm.ipPrefix.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newSubnetObj['ip-prefix']" name="ipPrefix" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))$/" ng-disabled="view.edit === 'view'" />
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newSubnetObj['virtual-router-ip']">
+                <label class="block basicLabel">Virtual router:
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="subnetForm.virtualRouter.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newSubnetObj['virtual-router-ip']" name="virtualRouter" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?$/"
+                ng-model="newSubnetObj['virtual-router-ip']" ng-disabled="view.edit === 'view'" />
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>
+        </form>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedSubnet">
+        <div ng-include src="view_path+'gateway.tpl.html'"></div>
+    </section>
+
+    <div class="formWrapper clearfix">
+        <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+        <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+        <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
+    </div>
 </div>
\ No newline at end of file
-<div ng-controller="l3EndpointCtrl" ng-init="init()">\r
-\r
-    <h2 class="text-center">L3 Prefix Endpoint</h2> \r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.endpoint">\r
-        <form name="l3EndpointForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-group']">\r
-                <label class="block basicLabel">Endpoint group:</label>\r
-                <select class="form-control" ng-model="newEndpointObj['endpoint-group']"  ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">\r
-                    <option value="">Select option</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-groups']">\r
-                <label class="basicLabel">Endpoint groups:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="epGroups in newEndpointObj['endpoint-groups'] track by $index">\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <select class="form-control" ng-model="epGroups"  ng-change="updateLeafListEl($index, epGroups, 'endpoint-groups')" ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">\r
-                                <option value="">Select option</option>\r
-                            </select>\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['condition']">\r
-                <label class="basicLabel">Condition:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('condition')" ng-disabled="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="condition in newEndpointObj['condition'] track by $index">\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <input class="form-control" type="text" ng-model="condition" ng-change="updateLeafListEl($index, condition, 'condition')" ng-disabled="view.edit === 'view'"/>\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'condition')" ng-disabled="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">L3 Context:\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="l3EndpointForm.l3context.$error.required"></i>\r
-                </label>\r
-                <select class="form-control" ng-model="newEndpointObj['l3-context']" name="l3context" ng-required="true"  ng-options="c.id as getDisplayLabel(c, l3context.labels) for c in l3context.options" ng-disabled="view.edit !== 'add'">\r
-                    <option>--</option>\r
-                </select>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-l2-gateways']">\r
-                <label class="basicLabel">L2 gateways:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewL2gateways()" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="l2gateways in newEndpointObj['endpoint-l2-gateways'] track by $index">\r
-                    <div class="separator col-md-11">\r
-                        <div class="inner-separator"></div>\r
-                    </div>\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <label class="block basicLabel">L2 context:</label>\r
-                            <select class="form-control" ng-model="l2gateways['l2-context']" ng-options="c.id as getDisplayLabel(c, l2context.labels) for c in l2context.options" ng-disabled="view.edit === 'view'">\r
-                                <option value="">Select option</option>\r
-                            </select>\r
-                        </div>\r
-\r
-                        <div class="rowWrapper">\r
-                            <label class="block basicLabel">MAC Address:\r
-                                <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="l3EndpointForm.macAddress.$error.pattern"></i>\r
-                            </label>\r
-                            <input class="form-control" type="text" name="macAddress" ng-pattern="/^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})$/" ng-model="l2gateways['mac-address']"/ ng-disabled="view.edit === 'view'">\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2 btn-list" ng-click="deleteNewL2gateways($index)" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-l3-gateways']">\r
-                <label class="basicLabel">L3 gateways:</label>\r
-                <button class="btn btn-primary btn-slim" ng-click="addNewL3gateways()" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>\r
-\r
-                <div ng-repeat="l3gateways in newEndpointObj['endpoint-l3-gateways'] track by $index">\r
-                    <div class="separator col-md-11">\r
-                        <div class="inner-separator"></div>\r
-                    </div>\r
-                    <div class="selectWrapper col-md-10">\r
-                        <div class="rowWrapper">\r
-                            <label class="block basicLabel">L3 Context:</label>\r
-                            <select class="form-control" ng-model="l3gateways['l3-context']" ng-options="c.id as getDisplayLabel(c, l3context.labels) for c in l3context.options" ng-disabled="view.edit === 'view'">\r
-                                <option value="">Select option</option>\r
-                            </select>\r
-                        </div>\r
-\r
-                        <div class="rowWrapper">\r
-                            <label class="block basicLabel">IP Address:\r
-                                <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="l3EndpointForm.ipAddress.$error.pattern"></i>\r
-                            </label>\r
-                            <input class="form-control" type="text" name="ipAddress" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/" ng-model="l3gateways['ip-address']" \r
-                            ng-disabled="view.edit === 'view'"/>\r
-                        </div>\r
-                    </div>\r
-                    <button class="btn btn-danger col-md-2 btn-list" ng-click="deleteNewL3gateways($index)" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="clearfix"></div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="basicLabel">IP prefix:\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="l3EndpointForm.ipprefix.$error.pattern"></i>\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="l3EndpointForm.ipprefix.$error.required"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="ipprefix" ng-model="newEndpointObj['ip-prefix']" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))$/" ng-required="true" ng-disabled="view.edit !== 'add'" />\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-show="view.edit === 'edit' || view.edit === 'add'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
-\r
+<div ng-controller="l3EndpointCtrl" ng-init="init()">
+
+    <h2 class="text-center">L3 Prefix Endpoint</h2> 
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.endpoint">
+        <form name="l3EndpointForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-group']">
+                <label class="block basicLabel">Endpoint group:</label>
+                <select class="form-control" ng-model="newEndpointObj['endpoint-group']"  ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">
+                    <option value="">Select option</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper clearfix" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-groups']">
+                <label class="basicLabel">Endpoint groups:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="epGroups in newEndpointObj['endpoint-groups'] track by $index">
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <select class="form-control" ng-model="epGroups"  ng-change="updateLeafListEl($index, epGroups, 'endpoint-groups')" ng-options="c.id as getDisplayLabel(c, epg.labels) for c in epg.options" ng-disabled="view.edit === 'view'">
+                                <option value="">Select option</option>
+                            </select>
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'endpoint-groups')" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['condition']">
+                <label class="basicLabel">Condition:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewLeafListEl('condition')" ng-disabled="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="condition in newEndpointObj['condition'] track by $index">
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <input class="form-control" type="text" ng-model="condition" ng-change="updateLeafListEl($index, condition, 'condition')" ng-disabled="view.edit === 'view'"/>
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2" ng-click="deleteNewLeafListEl($index,'condition')" ng-disabled="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">L3 Context:
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="l3EndpointForm.l3context.$error.required"></i>
+                </label>
+                <select class="form-control" ng-model="newEndpointObj['l3-context']" name="l3context" ng-required="true"  ng-options="c.id as getDisplayLabel(c, l3context.labels) for c in l3context.options" ng-disabled="view.edit !== 'add'">
+                    <option>--</option>
+                </select>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-l2-gateways']">
+                <label class="basicLabel">L2 gateways:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewL2gateways()" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="l2gateways in newEndpointObj['endpoint-l2-gateways'] track by $index">
+                    <div class="separator col-md-11">
+                        <div class="inner-separator"></div>
+                    </div>
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <label class="block basicLabel">L2 context:</label>
+                            <select class="form-control" ng-model="l2gateways['l2-context']" ng-options="c.id as getDisplayLabel(c, l2context.labels) for c in l2context.options" ng-disabled="view.edit === 'view'">
+                                <option value="">Select option</option>
+                            </select>
+                        </div>
+
+                        <div class="rowWrapper">
+                            <label class="block basicLabel">MAC Address:
+                                <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="l3EndpointForm.macAddress.$error.pattern"></i>
+                            </label>
+                            <input class="form-control" type="text" name="macAddress" ng-pattern="/^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})$/" ng-model="l2gateways['mac-address']"/ ng-disabled="view.edit === 'view'">
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2 btn-list" ng-click="deleteNewL2gateways($index)" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newEndpointObj['endpoint-l3-gateways']">
+                <label class="basicLabel">L3 gateways:</label>
+                <button class="btn btn-primary btn-slim" ng-click="addNewL3gateways()" ng-hide="view.edit === 'view'"><i class="icon-plus"></i></button>
+
+                <div ng-repeat="l3gateways in newEndpointObj['endpoint-l3-gateways'] track by $index">
+                    <div class="separator col-md-11">
+                        <div class="inner-separator"></div>
+                    </div>
+                    <div class="selectWrapper col-md-10">
+                        <div class="rowWrapper">
+                            <label class="block basicLabel">L3 Context:</label>
+                            <select class="form-control" ng-model="l3gateways['l3-context']" ng-options="c.id as getDisplayLabel(c, l3context.labels) for c in l3context.options" ng-disabled="view.edit === 'view'">
+                                <option value="">Select option</option>
+                            </select>
+                        </div>
+
+                        <div class="rowWrapper">
+                            <label class="block basicLabel">IP Address:
+                                <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="l3EndpointForm.ipAddress.$error.pattern"></i>
+                            </label>
+                            <input class="form-control" type="text" name="ipAddress" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/" ng-model="l3gateways['ip-address']" 
+                            ng-disabled="view.edit === 'view'"/>
+                        </div>
+                    </div>
+                    <button class="btn btn-danger col-md-2 btn-list" ng-click="deleteNewL3gateways($index)" ng-hide="view.edit === 'view'"><i class="icon-remove"></i></button>
+                </div>
+            </div>
+
+            <div class="clearfix"></div>
+
+            <div class="rowWrapper">
+                <label class="basicLabel">IP prefix:
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="l3EndpointForm.ipprefix.$error.pattern"></i>
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="l3EndpointForm.ipprefix.$error.required"></i>
+                </label>
+                <input class="form-control" type="text" name="ipprefix" ng-model="newEndpointObj['ip-prefix']" ng-pattern="/^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))$/" ng-required="true" ng-disabled="view.edit !== 'add'" />
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-show="view.edit === 'edit' || view.edit === 'add'">Save</button>
+        </form>
+    </section>
+
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
+
 </div>
\ No newline at end of file
@@ -1,22 +1,22 @@
-<section ng-controller="governanceCtrl">\r
-    <section class="col-md-9">\r
-        \r
-        <section ng-if="contentTpl" ng-include src="view_path + 'governance/' + contentTpl + '.tpl.html'" onload="checkBroadcastCalling(contentTpl)"></section>\r
-        \r
-    </section>\r
-\r
-    <!-- RIGHT PANEL -->\r
-    <aside class="col-md-3"> \r
-        <section class="inWrapper">\r
-\r
-            <!-- Menu including -->\r
-            <section ng-if="menuTpl" ng-include src="view_path + 'menu/' + menuTpl + '.tpl.html'"></section>\r
-            <section class="mb50" ng-if="menuBox" ng-include src="view_path + 'box/' + menuBox + '.tpl.html'" onload="broadcastCalling('menuBox')"></section>\r
-        </section>\r
-    </aside>\r
-\r
-    <section ng-show="wizards.actionReferenceWizard">\r
-        <div ng-include src="view_path+'wizards/actionReferenceWizard.tpl.html'"></div>\r
-    </section>\r
-</section>\r
-\r
+<section ng-controller="governanceCtrl">
+    <section class="col-md-9">
+        
+        <section ng-if="contentTpl" ng-include src="view_path + 'governance/' + contentTpl + '.tpl.html'" onload="checkBroadcastCalling(contentTpl)"></section>
+        
+    </section>
+
+    <!-- RIGHT PANEL -->
+    <aside class="col-md-3"> 
+        <section class="inWrapper">
+
+            <!-- Menu including -->
+            <section ng-if="menuTpl" ng-include src="view_path + 'menu/' + menuTpl + '.tpl.html'"></section>
+            <section class="mb50" ng-if="menuBox" ng-include src="view_path + 'box/' + menuBox + '.tpl.html'" onload="broadcastCalling('menuBox')"></section>
+        </section>
+    </aside>
+
+    <section ng-show="wizards.actionReferenceWizard">
+        <div ng-include src="view_path+'wizards/actionReferenceWizard.tpl.html'"></div>
+    </section>
+</section>
+
@@ -1,39 +1,39 @@
-<h1 class="text-center">GBP</h1>\r
-\r
-<nav class="mainNavigation">\r
-\r
-    <div class="topButtonsWrapper">\r
-        <div class="buttonWrapper">\r
-            <button class="btn btn-primary btn-large" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','policySub', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Policy', true);"></i>Policy expression</button>\r
-            <i class="icon-large icon-circle-arrow-down"></i>\r
-        </div>\r
-    </div>\r
-\r
-    <div class="middleButtonsWrapper">\r
-        <div class="buttonWrapper">\r
-            <button class="btn btn-primary btn-large" ng-click="toggleExpandedMM('governance', null, 'GOV_INIT'); setViewExpand('subMenuView','governance', true); setBreadcrumb('l1', 'Governance', true);">Governance</button>\r
-            <div class="iconWrapper">\r
-                <i class="icon-large icon-circle-arrow-right"></i>\r
-            </div>\r
-        </div>\r
-\r
-        <div class="middleBox">\r
-            <div class="infinityIcon" ng-click="toggleExpandedMM('governance', null, 'GOV_INIT'); setBreadcrumb('l1', 'Governance', true);"></div>\r
-        </div>\r
-\r
-        <div class="buttonWrapper">\r
-            <div class="iconWrapper">\r
-                <i class="icon-large icon-circle-arrow-left"></i>\r
-            </div>\r
-            <button class="btn btn-primary btn-large" ></i>Operational constraints</button>\r
-        </div>\r
-    </div>\r
-    \r
-    <div class="bottomButtonsWrapper">\r
-        <div class="buttonWrapper">\r
-            <i class="icon-large icon-circle-arrow-up"></i>\r
-            <button class="btn btn-primary btn-large" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView', 'renderers', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);"></i>Renderer configuration</button>\r
-        </div>\r
-    </div>\r
-\r
+<h1 class="text-center">GBP</h1>
+
+<nav class="mainNavigation">
+
+    <div class="topButtonsWrapper">
+        <div class="buttonWrapper">
+            <button class="btn btn-primary btn-large" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','policySub', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Policy', true);"></i>Policy expression</button>
+            <i class="icon-large icon-circle-arrow-down"></i>
+        </div>
+    </div>
+
+    <div class="middleButtonsWrapper">
+        <div class="buttonWrapper">
+            <button class="btn btn-primary btn-large" ng-click="toggleExpandedMM('governance', null, 'GOV_INIT'); setViewExpand('subMenuView','governance', true); setBreadcrumb('l1', 'Governance', true);">Governance</button>
+            <div class="iconWrapper">
+                <i class="icon-large icon-circle-arrow-right"></i>
+            </div>
+        </div>
+
+        <div class="middleBox">
+            <div class="infinityIcon" ng-click="toggleExpandedMM('governance', null, 'GOV_INIT'); setBreadcrumb('l1', 'Governance', true);"></div>
+        </div>
+
+        <div class="buttonWrapper">
+            <div class="iconWrapper">
+                <i class="icon-large icon-circle-arrow-left"></i>
+            </div>
+            <button class="btn btn-primary btn-large" ></i>Operational constraints</button>
+        </div>
+    </div>
+    
+    <div class="bottomButtonsWrapper">
+        <div class="buttonWrapper">
+            <i class="icon-large icon-circle-arrow-up"></i>
+            <button class="btn btn-primary btn-large" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView', 'renderers', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);"></i>Renderer configuration</button>
+        </div>
+    </div>
+
 </nav>
\ No newline at end of file
-<section ng-controller="policyRendererCtrl">\r
-    <!-- TOPOLOGY -->\r
-    <section class="sigmaWrapper col-md-9">\r
-        <section class="sigmaModalWrapper simpleBox" ng-controller="linkDataCtrl" ng-show="showTable">\r
-            <div class="tableWrapper">\r
-                <i class="icon-remove" ng-click="close()"></i>\r
-\r
-                <div class="dataWrapper">\r
-                    <section ng-repeat="subject in linkData">\r
-                        <section class="header">\r
-                            <span class="block">{{ 'Subject: ' + subject.name }}</span>\r
-                        </section>\r
-\r
-                        <section class="ml10" ng-repeat="rule in subject['ui-rule']">\r
-                            <label class="block">Rule:{{rule.name}}</label>\r
-                            <section class="ml10" ng-repeat="classifier in rule['classifier-ref']">\r
-                                <span class="block">Classifier:</span>\r
-                                <ul>\r
-                                    <li ng-repeat="(key, value) in classifier">{{key}}: {{value}}</li>\r
-                                </ul>\r
-                            </section>\r
-                            <section ng-repeat="classifier in rule['action-ref']">\r
-                                <span class="block">Action:</span>\r
-                                <ul>\r
-                                    <li ng-repeat="(key, value) in classifier">{{key}}: {{value}}</li>\r
-                                </ul>\r
-                            </section>\r
-                        </section>\r
-                    </section>\r
-                </div>\r
-            </div>\r
-        </section>\r
-        \r
-        \r
-        <section class="policyGraphWrapper">\r
-            <div graph="graph" id="graph" grid-size="1" />\r
-        </section>\r
-\r
-        <div class="topoNav">\r
-            <label class="block"><span>Topology type:</span></label>\r
-            <div class="btn-group" role="group">\r
-              <button type="button" class="btn btn-primary" ng-click="loadTopology('CONFIG', { tenantId: selectedTenant.id })">Config</button>\r
-              <button type="button" class="btn btn-primary" ng-click="loadTopology('OPERATIONAL', { tenantId: selectedTenant.id })">Operational</button>\r
-              <button type="button" class="btn btn-primary" ng-click="loadTopology('L2L3', { tenantId: selectedTenant.id, storage: 'config' })">L2/L3</button>\r
-            </div>\r
-        </div>\r
-\r
-    </section>\r
-\r
-    <!-- RIGHT PANEL -->\r
-    <aside class="col-md-3"> \r
-        <section class="inWrapper">\r
-\r
-            <div ng-include src="view_path+'parts/breadcrumbs.tpl.html'" class="breadcrumbs clearfix"></div>\r
-\r
-            <div class="block clearfix" style="height: 109px;">\r
-                <!-- Tenants list -->\r
-                <div class="rowWrapper clearfix">\r
-                    <label class="block"><span>Tenants list</span></label>\r
-                    <div class="selectWrapper col-md-12">\r
-                        <select class="form-control" ng-model="selectedTenant" ng-change="setTenant(selectedTenant); reloadTopo();" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in tenantList">\r
-                            <option value="">Select option</option>\r
-                        </select>\r
-                    </div>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.basic">\r
-                <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','policySub'); setBreadcrumb('l2', 'Policy', subMenuView.policySub);" tooltip="Show/Hide policy submenu" >Policy</button>\r
-                <section ng-show="subMenuView.policySub">\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('tenants'); setBreadcrumb('l3', 'Tenants', policyRendererView.tenants);" tooltip="CRUD for tenants" >Tenants</button>\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('epg'); setBreadcrumb('l3', 'Endpoint groups', policyRendererView.epg);" tooltip="CRUD for endpoint groups">Endpoint groups</button>\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('contracts'); setBreadcrumb('l3', 'Contracts', policyRendererView.contracts);" tooltip="CRUD for contracts">Contracts</button>\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('l2l3'); setBreadcrumb('l3', 'L2/L3', policyRendererView.l2l3);" tooltip="CRUD for l2/l3">L2/L3</button>\r
-                </section>\r
-\r
-                <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','renderers'); setBreadcrumb('l2', 'Renderers', subMenuView.renderers);" tooltip="Show/Hide renderers submenu" >Renderers</button>\r
-\r
-                <section ng-show="subMenuView.renderers">\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('classifiers'); setBreadcrumb('l3', 'Classifiers', policyRendererView.classifiers);" tooltip="CRUD for classifiers">Classifiers</button>\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('actions'); setBreadcrumb('l3', 'Actions', policyRendererView.actions);" tooltip="CRUD for actions">Actions</button>\r
-                </section>\r
-\r
-                <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','endpoints'); setBreadcrumb('l2', 'Endpoints', subMenuView.endpoints);" tooltip="Show/Hide endpoints submenu">Endpoints</button>\r
-                <section ng-show="subMenuView.endpoints">\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('registerEndpoint'); setBreadcrumb('l3', 'Endpoint', policyRendererView.registerEndpoint);" tooltip="CRUD for endpoint">Endpoint</button>\r
-                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('registerL3PrefixEndpoint'); setBreadcrumb('l3', 'L3 prefix endpoint', policyRendererView.registerL3PrefixEndpoint);" tooltip="CRUD for L3 prefix endpoint">L3 prefix endpoint</button>\r
-                </section>\r
-                <!-- <button class="btn btn-primary col-md-12" ng-click="toggleExpanded('docs')"  >Docs</button> -->\r
-\r
-                <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-                <button class="btn btn-primary bottom-buttons full-width" ng-click="toggleExpandedMM('main')"  >Home</button>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.tenants">\r
-                <div ng-include src="view_path+'tenants.tpl.html'"></div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.l2l3">\r
-                <div ng-include src="view_path+'l2l3.tpl.html'"></div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.epg" ng-controller="epgCtrl">\r
-                <div ng-include src="view_path+'epg.tpl.html'"></div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.contracts">\r
-                <div ng-include src="view_path+'contracts.tpl.html'"></div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.docs">\r
-                <div ng-include src="view_path+'docs.tpl.html'"></div>\r
-            </div>\r
-\r
-            <div ng-controller="renderersCtrl">\r
-                <div class="panelWrapper clearfix" ng-show="policyRendererView.classifiers" ng-controller="classifiersCtrl">\r
-                    <div ng-include src="view_path+'classifiers.tpl.html'"></div>\r
-                </div>\r
-\r
-                <div class="panelWrapper clearfix" ng-show="policyRendererView.actions" ng-controller="actionsCtrl">\r
-                    <div ng-include src="view_path+'actions.tpl.html'"></div>\r
-                </div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.registerEndpoint">\r
-                <div ng-include src="view_path+'endpoint.tpl.html'"></div>\r
-            </div>\r
-\r
-            <div class="panelWrapper clearfix" ng-show="policyRendererView.registerL3PrefixEndpoint">\r
-                <div ng-include src="view_path+'l3-endpoint.tpl.html'"></div>\r
-            </div>\r
-\r
-\r
-\r
-        </section>\r
-    </aside>\r
-\r
-    <div ng-if="wizards.accessModelWizard">\r
-        <div ng-include src="view_path+'wizards/accessModelWizard.tpl.html'"></div>\r
-    </div>\r
-</section>\r
+<section ng-controller="policyRendererCtrl">
+    <!-- TOPOLOGY -->
+    <section class="sigmaWrapper col-md-9">
+        <section class="sigmaModalWrapper simpleBox" ng-controller="linkDataCtrl" ng-show="showTable">
+            <div class="tableWrapper">
+                <i class="icon-remove" ng-click="close()"></i>
+
+                <div class="dataWrapper">
+                    <section ng-repeat="subject in linkData">
+                        <section class="header">
+                            <span class="block">{{ 'Subject: ' + subject.name }}</span>
+                        </section>
+
+                        <section class="ml10" ng-repeat="rule in subject['ui-rule']">
+                            <label class="block">Rule:{{rule.name}}</label>
+                            <section class="ml10" ng-repeat="classifier in rule['classifier-ref']">
+                                <span class="block">Classifier:</span>
+                                <ul>
+                                    <li ng-repeat="(key, value) in classifier">{{key}}: {{value}}</li>
+                                </ul>
+                            </section>
+                            <section ng-repeat="classifier in rule['action-ref']">
+                                <span class="block">Action:</span>
+                                <ul>
+                                    <li ng-repeat="(key, value) in classifier">{{key}}: {{value}}</li>
+                                </ul>
+                            </section>
+                        </section>
+                    </section>
+                </div>
+            </div>
+        </section>
+        
+        
+        <section class="policyGraphWrapper">
+            <div graph="graph" id="graph" grid-size="1" />
+        </section>
+
+        <div class="topoNav">
+            <label class="block"><span>Topology type:</span></label>
+            <div class="btn-group" role="group">
+              <button type="button" class="btn btn-primary" ng-click="loadTopology('CONFIG', { tenantId: selectedTenant.id })">Config</button>
+              <button type="button" class="btn btn-primary" ng-click="loadTopology('OPERATIONAL', { tenantId: selectedTenant.id })">Operational</button>
+              <button type="button" class="btn btn-primary" ng-click="loadTopology('L2L3', { tenantId: selectedTenant.id, storage: 'config' })">L2/L3</button>
+            </div>
+        </div>
+
+    </section>
+
+    <!-- RIGHT PANEL -->
+    <aside class="col-md-3"> 
+        <section class="inWrapper">
+
+            <div ng-include src="view_path+'parts/breadcrumbs.tpl.html'" class="breadcrumbs clearfix"></div>
+
+            <div class="block clearfix" style="height: 109px;">
+                <!-- Tenants list -->
+                <div class="rowWrapper clearfix">
+                    <label class="block"><span>Tenants list</span></label>
+                    <div class="selectWrapper col-md-12">
+                        <select class="form-control" ng-model="selectedTenant" ng-change="setTenant(selectedTenant); reloadTopo();" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in tenantList">
+                            <option value="">Select option</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.basic">
+                <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','policySub'); setBreadcrumb('l2', 'Policy', subMenuView.policySub);" tooltip="Show/Hide policy submenu" >Policy</button>
+                <section ng-show="subMenuView.policySub">
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('tenants'); setBreadcrumb('l3', 'Tenants', policyRendererView.tenants);" tooltip="CRUD for tenants" >Tenants</button>
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('epg'); setBreadcrumb('l3', 'Endpoint groups', policyRendererView.epg);" tooltip="CRUD for endpoint groups">Endpoint groups</button>
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('contracts'); setBreadcrumb('l3', 'Contracts', policyRendererView.contracts);" tooltip="CRUD for contracts">Contracts</button>
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('l2l3'); setBreadcrumb('l3', 'L2/L3', policyRendererView.l2l3);" tooltip="CRUD for l2/l3">L2/L3</button>
+                </section>
+
+                <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','renderers'); setBreadcrumb('l2', 'Renderers', subMenuView.renderers);" tooltip="Show/Hide renderers submenu" >Renderers</button>
+
+                <section ng-show="subMenuView.renderers">
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('classifiers'); setBreadcrumb('l3', 'Classifiers', policyRendererView.classifiers);" tooltip="CRUD for classifiers">Classifiers</button>
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('actions'); setBreadcrumb('l3', 'Actions', policyRendererView.actions);" tooltip="CRUD for actions">Actions</button>
+                </section>
+
+                <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','endpoints'); setBreadcrumb('l2', 'Endpoints', subMenuView.endpoints);" tooltip="Show/Hide endpoints submenu">Endpoints</button>
+                <section ng-show="subMenuView.endpoints">
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('registerEndpoint'); setBreadcrumb('l3', 'Endpoint', policyRendererView.registerEndpoint);" tooltip="CRUD for endpoint">Endpoint</button>
+                    <button class="btn btn-default col-md-12" ng-click="toggleExpanded('registerL3PrefixEndpoint'); setBreadcrumb('l3', 'L3 prefix endpoint', policyRendererView.registerL3PrefixEndpoint);" tooltip="CRUD for L3 prefix endpoint">L3 prefix endpoint</button>
+                </section>
+                <!-- <button class="btn btn-primary col-md-12" ng-click="toggleExpanded('docs')"  >Docs</button> -->
+
+                <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+                <button class="btn btn-primary bottom-buttons full-width" ng-click="toggleExpandedMM('main')"  >Home</button>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.tenants">
+                <div ng-include src="view_path+'tenants.tpl.html'"></div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.l2l3">
+                <div ng-include src="view_path+'l2l3.tpl.html'"></div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.epg" ng-controller="epgCtrl">
+                <div ng-include src="view_path+'epg.tpl.html'"></div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.contracts">
+                <div ng-include src="view_path+'contracts.tpl.html'"></div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.docs">
+                <div ng-include src="view_path+'docs.tpl.html'"></div>
+            </div>
+
+            <div ng-controller="renderersCtrl">
+                <div class="panelWrapper clearfix" ng-show="policyRendererView.classifiers" ng-controller="classifiersCtrl">
+                    <div ng-include src="view_path+'classifiers.tpl.html'"></div>
+                </div>
+
+                <div class="panelWrapper clearfix" ng-show="policyRendererView.actions" ng-controller="actionsCtrl">
+                    <div ng-include src="view_path+'actions.tpl.html'"></div>
+                </div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.registerEndpoint">
+                <div ng-include src="view_path+'endpoint.tpl.html'"></div>
+            </div>
+
+            <div class="panelWrapper clearfix" ng-show="policyRendererView.registerL3PrefixEndpoint">
+                <div ng-include src="view_path+'l3-endpoint.tpl.html'"></div>
+            </div>
+
+
+
+        </section>
+    </aside>
+
+    <div ng-if="wizards.accessModelWizard">
+        <div ng-include src="view_path+'wizards/accessModelWizard.tpl.html'"></div>
+    </div>
+</section>
@@ -1,31 +1,31 @@
-<div ng-include src="view_path+'parts/breadcrumbs.tpl.html'" class="breadcrumbs clearfix"></div>\r
-\r
-<div class="panelWrapper clearfix no-padd-top">\r
-    <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','policy');" tooltip="Show/Hide policy submenu"></i>Policy expression</button>\r
-    <section ng-show="subMenuView.policy">\r
-        <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','policySub', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Policy', true);" >Policy</button>\r
-        <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','renderers', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);">Renderers</button>\r
-        <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','endpoints', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Endpoints', true);">Endpoints</button>\r
-    </section>\r
-\r
-\r
-\r
-    <button class="btn btn-primary col-md-12 btn-lg" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);"></i>Renderer configuration</button>\r
-\r
-    <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','governance')" tooltip="Show/Hide governance submenu">Governance</button>\r
-\r
-    <section ng-show="subMenuView.governance">\r
-        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'main' && mainView.governance ? 'activated' : ''" ng-click="toggleExpandedMM('governance', true, 'GOV_INIT'); setBreadcrumb('l1', 'Governance', true);" >Governance</button>\r
-        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'expressed-policy' ? 'activated' : ''" ng-click="toggleExpanded('expressed-policy'); setBreadcrumb('l2', 'Expressed policy', true);" tooltip="Show expressed policy diagram">Expressed policy</button>\r
-        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'delivered-policy' || contentTpl === 'epg-detail' || contentTpl === 'subject-detail' ? 'activated' : ''" ng-click="toggleExpanded('delivered-policy'); setBreadcrumb('l2', 'Delivered policy', true);" tooltip="Show delivered policy diagram">Delivered policy</button>\r
-\r
-        <!-- <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true);" >Renderer configuration</button> -->\r
-\r
-        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'renderer-state' ? 'activated' : ''" ng-click="toggleExpanded('renderer-state'); setBreadcrumb('l1', 'Governance', true); setBreadcrumb('l2', 'Renderer state', true);">Renderer state</button>\r
-    </section>\r
-\r
-    <button class="btn btn-primary col-md-12 btn-lg" ></i>Operational constraints</button>\r
-\r
-    <button class="btn btn-primary bottom-buttons full-width" ng-click="toggleExpandedMM('main')"  >Home</button>\r
-</div>\r
-\r
+<div ng-include src="view_path+'parts/breadcrumbs.tpl.html'" class="breadcrumbs clearfix"></div>
+
+<div class="panelWrapper clearfix no-padd-top">
+    <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','policy');" tooltip="Show/Hide policy submenu"></i>Policy expression</button>
+    <section ng-show="subMenuView.policy">
+        <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','policySub', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Policy', true);" >Policy</button>
+        <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','renderers', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);">Renderers</button>
+        <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setViewExpand('subMenuView','endpoints', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Endpoints', true);">Endpoints</button>
+    </section>
+
+
+
+    <button class="btn btn-primary col-md-12 btn-lg" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l1', 'Policy expression', true); setBreadcrumb('l2', 'Renderers', true);"></i>Renderer configuration</button>
+
+    <button class="btn btn-primary col-md-12 btn-lg" ng-click="setViewExpand('subMenuView','governance')" tooltip="Show/Hide governance submenu">Governance</button>
+
+    <section ng-show="subMenuView.governance">
+        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'main' && mainView.governance ? 'activated' : ''" ng-click="toggleExpandedMM('governance', true, 'GOV_INIT'); setBreadcrumb('l1', 'Governance', true);" >Governance</button>
+        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'expressed-policy' ? 'activated' : ''" ng-click="toggleExpanded('expressed-policy'); setBreadcrumb('l2', 'Expressed policy', true);" tooltip="Show expressed policy diagram">Expressed policy</button>
+        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'delivered-policy' || contentTpl === 'epg-detail' || contentTpl === 'subject-detail' ? 'activated' : ''" ng-click="toggleExpanded('delivered-policy'); setBreadcrumb('l2', 'Delivered policy', true);" tooltip="Show delivered policy diagram">Delivered policy</button>
+
+        <!-- <button class="btn btn-default col-md-12" ng-click="toggleExpandedMM('policy-renderer'); setViewExpand('policyRendererView', 'basic', true);" >Renderer configuration</button> -->
+
+        <button class="btn btn-default col-md-12" ng-class="contentTpl === 'renderer-state' ? 'activated' : ''" ng-click="toggleExpanded('renderer-state'); setBreadcrumb('l1', 'Governance', true); setBreadcrumb('l2', 'Renderer state', true);">Renderer state</button>
+    </section>
+
+    <button class="btn btn-primary col-md-12 btn-lg" ></i>Operational constraints</button>
+
+    <button class="btn btn-primary bottom-buttons full-width" ng-click="toggleExpandedMM('main')"  >Home</button>
+</div>
+
@@ -1,32 +1,32 @@
-<section class="rowWrapper clearfix" ng-controller="crudCtrl">\r
-    <div class="inline-block full-width">\r
-        <label class="block float-left"><span>{{ crudLabel }}</span></label>\r
-\r
-        <button type="button" class="btn btn-primary col-md-4 float-right" ng-click="filter = !filter"><i class="icon-filter"></i></button>\r
-    </div>\r
-\r
-    <div ng-init="filter = false" class="ep-filter" ng-show="filter">\r
-        <div class="inline-block">\r
-            <label class="block"><span>Endpoint group</span></label>\r
-            <input type="text" class="form-control" ng-model="q['endpoint-group']" placeholder="Filter by Endpoint groups"/>\r
-        </div>\r
-\r
-        <div class="inline-block">\r
-            <label class="block"><span>Network containment</span></label>\r
-            <input type="text" class="form-control" ng-model="q['network-containment']" placeholder="Filter by netw. containment"/>\r
-        </div>\r
-    </div>\r
-\r
-    <div class="selectWrapper col-md-6">\r
-        <select class="form-control" ng-model="selectedObj" ng-change="reload(selectedObj)" ng-options="getDisplayLabel(d, displayLabel) for d in list | filter:q">\r
-            <option value="">Select option</option>\r
-        </select>\r
-\r
-    </div>\r
-\r
-    <div class="btn-group col-md-6" role="group">\r
-      <button type="button" class="btn btn-primary col-md-4" ng-click="add()">Add</button>\r
-      <button type="button" class="btn btn-primary col-md-4" ng-click="modify()">Edit</button>\r
-      <button type="button" class="btn btn-primary col-md-4" ng-click="delete()">Delete</button>\r
-    </div>\r
+<section class="rowWrapper clearfix" ng-controller="crudCtrl">
+    <div class="inline-block full-width">
+        <label class="block float-left"><span>{{ crudLabel }}</span></label>
+
+        <button type="button" class="btn btn-primary col-md-4 float-right" ng-click="filter = !filter"><i class="icon-filter"></i></button>
+    </div>
+
+    <div ng-init="filter = false" class="ep-filter" ng-show="filter">
+        <div class="inline-block">
+            <label class="block"><span>Endpoint group</span></label>
+            <input type="text" class="form-control" ng-model="q['endpoint-group']" placeholder="Filter by Endpoint groups"/>
+        </div>
+
+        <div class="inline-block">
+            <label class="block"><span>Network containment</span></label>
+            <input type="text" class="form-control" ng-model="q['network-containment']" placeholder="Filter by netw. containment"/>
+        </div>
+    </div>
+
+    <div class="selectWrapper col-md-6">
+        <select class="form-control" ng-model="selectedObj" ng-change="reload(selectedObj)" ng-options="getDisplayLabel(d, displayLabel) for d in list | filter:q">
+            <option value="">Select option</option>
+        </select>
+
+    </div>
+
+    <div class="btn-group col-md-6" role="group">
+      <button type="button" class="btn btn-primary col-md-4" ng-click="add()">Add</button>
+      <button type="button" class="btn btn-primary col-md-4" ng-click="modify()">Edit</button>
+      <button type="button" class="btn btn-primary col-md-4" ng-click="delete()">Delete</button>
+    </div>
 </section>
\ No newline at end of file
@@ -1,15 +1,15 @@
-<section class="rowWrapper clearfix" ng-controller="crudCtrl">\r
-    <label class="block"><span>{{ crudLabel }}</span></label>\r
-\r
-    <div class="selectWrapper col-md-6">\r
-        <select class="form-control" ng-model="selectedObj" ng-change="reload(selectedObj)" ng-options="getDisplayLabel(d, displayLabel) for d in list">\r
-            <option value="">Select option</option>\r
-        </select>\r
-    </div>\r
-\r
-    <div class="btn-group col-md-6" role="group">\r
-      <button type="button" class="btn btn-primary col-md-4" ng-click="add()">Add</button>\r
-      <button type="button" class="btn btn-primary col-md-4" ng-click="modify()">Edit</button>\r
-      <button type="button" class="btn btn-primary col-md-4" ng-click="delete()">Delete</button>\r
-    </div>\r
+<section class="rowWrapper clearfix" ng-controller="crudCtrl">
+    <label class="block"><span>{{ crudLabel }}</span></label>
+
+    <div class="selectWrapper col-md-6">
+        <select class="form-control" ng-model="selectedObj" ng-change="reload(selectedObj)" ng-options="getDisplayLabel(d, displayLabel) for d in list">
+            <option value="">Select option</option>
+        </select>
+    </div>
+
+    <div class="btn-group col-md-6" role="group">
+      <button type="button" class="btn btn-primary col-md-4" ng-click="add()">Add</button>
+      <button type="button" class="btn btn-primary col-md-4" ng-click="modify()">Edit</button>
+      <button type="button" class="btn btn-primary col-md-4" ng-click="delete()">Delete</button>
+    </div>
 </section>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
similarity index 98%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/views/rules.tpl.html
rename to groupbasedpolicy-old-ui/module/src/main/resources/gbp/views/rules.tpl.html
index 262ef4a..6bffd40
@@ -1,36 +1,36 @@
-<div ng-controller="ruleCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section ng-show="internalView.rule">\r
-        <form name="rulesForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            \r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel"><span>Name:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="{{rulesForm.name.$error.required ? 'Required field' : rulesForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="rulesForm.name.$error.required || rulesForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newRuleObj.name" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newRuleObj['order']">\r
-                <label class="block basicLabel"><span>Order:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="rulesForm.order.$error.required"></i>\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32 && !rulesForm.order.$error.required"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="order" ng-required="true" ng-model="newRuleObj.order" ng-disabled="internalView.edit === 'view'" ng-change="validate(newRuleObj.order, errors)"/>\r
-            </div>\r
-            \r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedRule">\r
-        <div ng-include src="view_path+'action-ref.tpl.html'"></div>\r
-    </section>\r
-\r
-    <section class="formWrapper clearfix" ng-show="selectedRule">\r
-        <div ng-include src="view_path+'classifier-ref.tpl.html'"></div>\r
-    </section>\r
-\r
+<div ng-controller="ruleCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section ng-show="internalView.rule">
+        <form name="rulesForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            
+            <div class="rowWrapper">
+                <label class="block basicLabel"><span>Name:</span>
+                    <i class="icon-exclamation-sign red" tooltip="{{rulesForm.name.$error.required ? 'Required field' : rulesForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="rulesForm.name.$error.required || rulesForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newRuleObj.name" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newRuleObj['order']">
+                <label class="block basicLabel"><span>Order:</span>
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="rulesForm.order.$error.required"></i>
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32 && !rulesForm.order.$error.required"></i>
+                </label>
+                <input class="form-control" type="text" name="order" ng-required="true" ng-model="newRuleObj.order" ng-disabled="internalView.edit === 'view'" ng-change="validate(newRuleObj.order, errors)"/>
+            </div>
+            
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>
+        </form>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedRule">
+        <div ng-include src="view_path+'action-ref.tpl.html'"></div>
+    </section>
+
+    <section class="formWrapper clearfix" ng-show="selectedRule">
+        <div ng-include src="view_path+'classifier-ref.tpl.html'"></div>
+    </section>
+
 </div>
\ No newline at end of file
@@ -1,31 +1,31 @@
-<div ng-controller="subjectCtrl" ng-init="init()">\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section ng-show="internalView.subject">\r
-        <form name="subjectForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel"><span>Name:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="{{subjectForm.name.$error.required ? 'Required field' : subjectForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="subjectForm.name.$error.required || subjectForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" ng-model="newSubjectObj.name" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newSubjectObj['order']">\r
-                <label class="block basicLabel"><span>Order:</span>\r
-                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="subjectForm.order.$error.required"></i>\r
-                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32 && !subjectForm.order.$error.required"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="order" ng-required="true" name="order" ng-model="newSubjectObj.order" ng-disabled="internalView.edit === 'view'" ng-change="validate(newSubjectObj.order, errors)"/>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-    \r
-    <section class="formWrapper clearfix" ng-show="selectedSubject">\r
-        <div ng-include src="view_path+'rules.tpl.html'"></div>\r
-    </section>\r
+<div ng-controller="subjectCtrl" ng-init="init()">
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section ng-show="internalView.subject">
+        <form name="subjectForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel"><span>Name:</span>
+                    <i class="icon-exclamation-sign red" tooltip="{{subjectForm.name.$error.required ? 'Required field' : subjectForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="subjectForm.name.$error.required || subjectForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" ng-model="newSubjectObj.name" name="name" ng-required="true" ng-disabled="internalView.edit !== 'add'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newSubjectObj['order']">
+                <label class="block basicLabel"><span>Order:</span>
+                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="subjectForm.order.$error.required"></i>
+                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32 && !subjectForm.order.$error.required"></i>
+                </label>
+                <input class="form-control" type="text" name="order" ng-required="true" name="order" ng-model="newSubjectObj.order" ng-disabled="internalView.edit === 'view'" ng-change="validate(newSubjectObj.order, errors)"/>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="internalView.edit === 'view'">Save</button>
+        </form>
+    </section>
+    
+    <section class="formWrapper clearfix" ng-show="selectedSubject">
+        <div ng-include src="view_path+'rules.tpl.html'"></div>
+    </section>
 </div>
\ No newline at end of file
@@ -1,38 +1,38 @@
-<div ng-controller="tenantCtrl" ng-init="init()">\r
-\r
-    <h2 class="text-center">Tenants</h2> \r
-\r
-\r
-    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>\r
-\r
-    <section class="formWrapper clearfix" ng-show="view.tenant">\r
-        <form name="tenantForm" novalidate="novalidate">\r
-            <i class="icon-remove align-right" ng-click="close()"></i>\r
-            <label class="block">Add Tenant</label>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Id:</label>\r
-                <input class="form-control" type="text" ng-model="newTenantObj.id" disabled/>\r
-            </div>\r
-\r
-            <div class="rowWrapper">\r
-                <label class="block basicLabel">Name:\r
-                    <i class="icon-exclamation-sign red" tooltip="{{tenantForm.name.$error.required ? 'Required field' : tenantForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="tenantForm.name.$error.required || tenantForm.name.$error.pattern"></i>\r
-                </label>\r
-                <input class="form-control" type="text" name="name" ng-model="newTenantObj.name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>\r
-            </div>\r
-\r
-            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newTenantObj.description">\r
-                <label class="block basicLabel">Description:</label>\r
-                <input class="form-control" type="text" ng-model="newTenantObj.description" ng-disabled="view.edit === 'view'"/>\r
-            </div>\r
-\r
-            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>\r
-        </form>\r
-    </section>\r
-\r
-    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>\r
-    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>\r
-\r
+<div ng-controller="tenantCtrl" ng-init="init()">
+
+    <h2 class="text-center">Tenants</h2> 
+
+
+    <div ng-include src="view_path+'parts/crud.tpl.html'"></div>
+
+    <section class="formWrapper clearfix" ng-show="view.tenant">
+        <form name="tenantForm" novalidate="novalidate">
+            <i class="icon-remove align-right" ng-click="close()"></i>
+            <label class="block">Add Tenant</label>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Id:</label>
+                <input class="form-control" type="text" ng-model="newTenantObj.id" disabled/>
+            </div>
+
+            <div class="rowWrapper">
+                <label class="block basicLabel">Name:
+                    <i class="icon-exclamation-sign red" tooltip="{{tenantForm.name.$error.required ? 'Required field' : tenantForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="tenantForm.name.$error.required || tenantForm.name.$error.pattern"></i>
+                </label>
+                <input class="form-control" type="text" name="name" ng-model="newTenantObj.name" ng-required="true" ng-disabled="view.edit === 'view'" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+            </div>
+
+            <div class="rowWrapper" ng-hide="view.edit === 'view' && !newTenantObj.description">
+                <label class="block basicLabel">Description:</label>
+                <input class="form-control" type="text" ng-model="newTenantObj.description" ng-disabled="view.edit === 'view'"/>
+            </div>
+
+            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="view.edit === 'view'">Save</button>
+        </form>
+    </section>
+
+    <button class="btn btn-primary  bottom-buttons full-width wizard-button" ng-click="showWizard('accessModelWizard')"><i class="icon-magic"></i>Access Model Wizard</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons home" ng-click="toggleExpandedMM('main')">Home</button>
+    <button class="btn btn-primary col-md-12 bottom-buttons back" ng-click="setViewExpand('policyRendererView', 'basic', true); setBreadcrumb('l3', null, false);">Back</button>
+
 </div>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
similarity index 90%
rename from groupbasedpolicy-ui/pom.xml
rename to groupbasedpolicy-old-ui/pom.xml
index a90ba5b..9f9ed01
@@ -11,8 +11,8 @@
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.opendaylight.groupbasedpolicy</groupId>
-  <artifactId>groupbasedpolicy-ui</artifactId>
-  <name>groupbasedpolicy-ui</name>
+  <artifactId>groupbasedpolicy-old-ui</artifactId>
+  <name>groupbasedpolicy-old-ui</name>
   <description>Resources</description>
   <version>0.4.0-SNAPSHOT</version>
   <packaging>pom</packaging>
diff --git a/pom.xml b/pom.xml
index e729b8a53cbb9e1cafcdd799e29c80af513858ac..990686bab89e3759ead1ac1eadb64d80c7555dde 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
     <module>neutron-mapper</module>
     <module>neutron-ovsdb</module>
     <module>ui-backend</module>
-    <module>groupbasedpolicy-ui</module>
+    <module>groupbasedpolicy-old-ui</module>
     <module>distribution-karaf</module>
     <module>features</module>
     <module>sxp-mapper</module>
index 1e6fd913e0d4703e7d4894657e8649fbdd517b1b..712e72dc7a56b64765783704195dcc2676669dfc 100644 (file)
@@ -51,7 +51,7 @@ public class SxpMapperProviderImpl implements AutoCloseable {
         this.rpcRegistryDependency = rpcRegistryDependency;
 
         final EndpointService endpointService = rpcRegistryDependency.getRpcService(EndpointService.class);
-        sxpMapperReactor = new SxpMapperReactorImpl(endpointService);
+        sxpMapperReactor = new SxpMapperReactorImpl(endpointService, dataBroker);
 
         final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao = new SimpleCachedDaoImpl<>();
         final SimpleCachedDao<IpPrefix, EndpointForwardingTemplateBySubnet> epForwardingTemplateCachedDao =
index 8ed0329b82044c987f33d3ba49200b4f329d9b54..861c1aa5bd2eeac5c9734c97c066b0fc15328339 100644 (file)
 
 package org.opendaylight.groupbasedpolicy.sxp.mapper.impl;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.JdkFutureAdapters;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collections;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SxpMapperReactor;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.SxpListenerUtil;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointForwardingTemplateBySubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointPolicyTemplateBySgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Purpose: exclusively processes sxp master database changes and EGP templates changes
  */
 public class SxpMapperReactorImpl implements SxpMapperReactor {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SxpMapperReactorImpl.class);
+
     private final EndpointService l3EndpointService;
+    private final DataBroker dataBroker;
 
-    public SxpMapperReactorImpl(final EndpointService l3EndpointService) {
-        this.l3EndpointService = l3EndpointService;
+    public SxpMapperReactorImpl(final EndpointService l3EndpointService, final DataBroker dataBroker) {
+        this.l3EndpointService = Preconditions.checkNotNull(l3EndpointService, "l3Endpoint service missing");
+        this.dataBroker = Preconditions.checkNotNull(dataBroker, "dataBroker missing");
     }
 
     @Override
-    public ListenableFuture<RpcResult<Void>> processPolicyAndSxpMasterDB(final EndpointPolicyTemplateBySgt template, final MasterDatabaseBinding masterDatabaseBinding) {
+    public ListenableFuture<RpcResult<Void>> processPolicyAndSxpMasterDB(final EndpointPolicyTemplateBySgt template, final MasterDatabaseBinding masterDBBinding) {
+        LOG.debug("processing ep-policy-template + sxpMasterDB entry: {} - {}",
+                masterDBBinding.getSecurityGroupTag(), masterDBBinding.getIpPrefix());
         // apply sxpMasterDB to policy template
-        final RegisterEndpointInput input = new RegisterEndpointInputBuilder()
+        final L3Address l3Address = buildL3Address(masterDBBinding.getIpPrefix());
+        final RegisterEndpointInput epInput = new RegisterEndpointInputBuilder()
                 .setCondition(template.getConditions())
                 .setTenant(template.getTenant())
                 .setEndpointGroups(template.getEndpointGroups())
+                .setL3Address(Collections.singletonList(l3Address))
                 .build();
 
-        // invoke service
-        return JdkFutureAdapters.listenInPoolThread(l3EndpointService.registerEndpoint(input));
+        return chainL3EPServiceIfEpAbsent(l3Address, epInput);
     }
 
     @Override
-    public ListenableFuture<RpcResult<Void>> processForwardingAndSxpMasterDB(final EndpointForwardingTemplateBySubnet template, final MasterDatabaseBinding masterDatabaseBinding) {
+    public ListenableFuture<RpcResult<Void>> processForwardingAndSxpMasterDB(final EndpointForwardingTemplateBySubnet template, final MasterDatabaseBinding masterDBBinding) {
+        LOG.debug("processing ep-forwarding-template + sxpMasterDB entry: {} - {}",
+                masterDBBinding.getSecurityGroupTag(), masterDBBinding.getIpPrefix());
         // apply sxpMasterDB to policy template
-        final RegisterEndpointInput input = new RegisterEndpointInputBuilder()
+        final L3Address l3Address = buildL3Address(masterDBBinding.getIpPrefix());
+        final RegisterEndpointInput epInput = new RegisterEndpointInputBuilder()
                 .setNetworkContainment(template.getNetworkContainment())
+                .setL3Address(Collections.singletonList(l3Address))
                 .build();
 
-        // invoke service
-        return JdkFutureAdapters.listenInPoolThread(l3EndpointService.registerEndpoint(input));
+        return chainL3EPServiceIfEpAbsent(l3Address, epInput);
+    }
+
+    private L3Address buildL3Address(final IpPrefix ipPrefix) {
+        final String ipv4PrefixValue = ipPrefix.getIpv4Prefix().getValue();
+        final IpAddress ipv4Value = new IpAddress(new Ipv4Address(ipv4PrefixValue.replaceFirst("/.+", "")));
+        return new L3AddressBuilder()
+                .setIpAddress(ipv4Value)
+                .setL3Context(new L3ContextId(ipv4PrefixValue))
+                .build();
+    }
+
+    private CheckedFuture<Optional<EndpointL3>, ReadFailedException> findExistingEndPoint(final L3Address l3Address) {
+        EndpointL3Key epL3key = new EndpointL3Key(l3Address.getIpAddress(), l3Address.getL3Context());
+        final ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
+        final CheckedFuture<Optional<EndpointL3>, ReadFailedException> read = rTx.read(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.l3EndpointIid(epL3key));
+        Futures.addCallback(read, SxpListenerUtil.createTxCloseCallback(rTx));
+        return read;
+    }
+
+    private ListenableFuture<RpcResult<Void>> chainL3EPServiceIfEpAbsent(final L3Address l3Address, final RegisterEndpointInput epInput) {
+        CheckedFuture<Optional<EndpointL3>, ReadFailedException> existingEndpointFuture = findExistingEndPoint(l3Address);
+
+        return Futures.transform(existingEndpointFuture, new AsyncFunction<Optional<EndpointL3>, RpcResult<Void>>() {
+            @Override
+            public ListenableFuture<RpcResult<Void>> apply(final Optional<EndpointL3> input) throws Exception {
+                final ListenableFuture<RpcResult<Void>> nextResult;
+                if (input == null || !input.isPresent()) {
+                    // invoke service
+                    return JdkFutureAdapters.listenInPoolThread(l3EndpointService.registerEndpoint(epInput));
+                } else {
+                    final String existingL3EpMsg = String.format("L3Endpoint for given key already exists: %s", l3Address);
+                    nextResult = Futures.immediateFailedFuture(new IllegalStateException(existingL3EpMsg));
+                }
+                return nextResult;
+            }
+        });
     }
 }
+
index 65ce34eb912241c60d4a17e4ac029dc31aff9da1..42297bc98d00d7ecb78ce8acad21052fa83969e1 100644 (file)
@@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  */
 public class EPForwardingTemplateDaoImpl implements DSAsyncDao<IpPrefix, EndpointForwardingTemplateBySubnet> {
 
-    public static final ListenableFuture<Optional<EndpointForwardingTemplateBySubnet>> READ_FUTURE_ABSENT = Futures.immediateFuture(Optional.absent());
+    private static final ListenableFuture<Optional<EndpointForwardingTemplateBySubnet>> READ_FUTURE_ABSENT = Futures.immediateFuture(Optional.absent());
     private final DataBroker dataBroker;
     private final SimpleCachedDao<IpPrefix, EndpointForwardingTemplateBySubnet> cachedDao;
 
@@ -73,7 +73,7 @@ public class EPForwardingTemplateDaoImpl implements DSAsyncDao<IpPrefix, Endpoin
                                 cachedDao.update(template.getIpPrefix(), template);
                             }
                         }
-                        return cachedDao.find(key);
+                        return lookup(cachedDao, key);
                     } else {
                         return Optional.absent();
                     }
index de2f60f7044fc38a58a16d0975e52194c76cd3cd..5e20b7e4ef94ea68706510f02c381b445c4c1d26 100644 (file)
@@ -19,8 +19,8 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.DSAsyncDao;
-import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SimpleCachedDao;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.EPTemplateListener;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SimpleCachedDao;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.SxpListenerUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointPolicyTemplateBySgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointPolicyTemplateBySgtKey;
@@ -32,6 +32,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  */
 public class EPPolicyTemplateDaoImpl implements DSAsyncDao<Sgt, EndpointPolicyTemplateBySgt> {
 
+    private static final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> READ_FUTURE_ABSENT = Futures.immediateFuture(Optional.absent());
+
     private final DataBroker dataBroker;
     private final SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> cachedDao;
 
@@ -46,6 +48,8 @@ public class EPPolicyTemplateDaoImpl implements DSAsyncDao<Sgt, EndpointPolicyTe
         final Optional<EndpointPolicyTemplateBySgt> cachedEndpointPolicyTemplateBySgtalue = lookup(cachedDao, key);
         if (cachedEndpointPolicyTemplateBySgtalue.isPresent()) {
             return Futures.immediateFuture(cachedEndpointPolicyTemplateBySgtalue);
+        } else if (!cachedDao.isEmpty()) {
+            return READ_FUTURE_ABSENT;
         } else {
             final ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
             final CheckedFuture<Optional<EndpointPolicyTemplateBySgt>, ReadFailedException> read =
index e2bf49988d3c95147ae430e7257f84ad018f901a..22fcf2df3cfa038501ccfea99299903367797923 100644 (file)
@@ -43,6 +43,7 @@ public class MasterDatabaseBindingDaoImpl implements DSAsyncDao<IpPrefix, Master
         ReadableByKey<Sgt, MasterDatabaseBinding> {
 
     private static final Logger LOG = LoggerFactory.getLogger(MasterDatabaseBindingDaoImpl.class);
+    private static final ListenableFuture<Optional<MasterDatabaseBinding>> READ_FUTURE_ABSENT = Futures.immediateFuture(Optional.absent());
 
     private final DataBroker dataBroker;
     private final SimpleCachedDao<IpPrefix, MasterDatabaseBinding> cachedDao;
@@ -58,6 +59,8 @@ public class MasterDatabaseBindingDaoImpl implements DSAsyncDao<IpPrefix, Master
         final Optional<MasterDatabaseBinding> cachedMasterDatabaseBinding = lookup(cachedDao, key);
         if (cachedMasterDatabaseBinding.isPresent()) {
             return Futures.immediateFuture(cachedMasterDatabaseBinding);
+        } else if (!cachedDao.isEmpty()) {
+            return READ_FUTURE_ABSENT;
         } else {
             final ListenableFuture<Void> cacheUpdatedFt = updateCache();
 
index 83d021acc969340129f30725b234cdc3b1141dd9..0df3b95ee0795177b529882ac618febff9f0078d 100644 (file)
@@ -13,9 +13,7 @@ import com.google.common.util.concurrent.AsyncFunction;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
@@ -32,7 +30,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,15 +87,18 @@ public class EPForwardingTemplateListenerImpl implements EPTemplateListener<Endp
         final ListenableFuture<RpcResult<Void>> allRpcResult = Futures.transform(sxpMasterDbItemFuture, new AsyncFunction<Optional<MasterDatabaseBinding>, RpcResult<Void>>() {
             @Override
             public ListenableFuture<RpcResult<Void>> apply(final Optional<MasterDatabaseBinding> input) throws Exception {
-                if (input == null && input.isPresent()) {
+                final ListenableFuture<RpcResult<Void>> rpcResult;
+                if (input == null || !input.isPresent()) {
                     LOG.debug("no epForwardingTemplate available for sgt: {}", changeKey);
-                    throw new IllegalArgumentException("no epForwardingTemplate available");
+                    rpcResult = RpcResultBuilder.<Void>failed()
+                            .withError(RpcError.ErrorType.APPLICATION,
+                                    "no ip-sgt mapping in sxpMasterDB available for " + changeKey)
+                            .buildFuture();
                 } else {
-                    List<ListenableFuture<RpcResult<Void>>> resultBag = new ArrayList<>();
                     LOG.trace("processing sxpMasterDB event and epForwardingTemplate for sgt: {}", changeKey);
-                    final ListenableFuture<RpcResult<Void>> rpcResult = sxpMapperReactor.processForwardingAndSxpMasterDB(epForwardingTemplate, input.get());
-                    return rpcResult;
+                    rpcResult = sxpMapperReactor.processForwardingAndSxpMasterDB(epForwardingTemplate, input.get());
                 }
+                return rpcResult;
             }
         });
 
index 6bd4a9d9b012b2b0559dfaceda4478ce10e09557..931ed602070676bf139ed6ddb1f7308a712c156d 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -31,7 +32,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -86,17 +89,24 @@ public class EPPolicyTemplateListenerImpl implements EPTemplateListener<Endpoint
         final ListenableFuture<List<RpcResult<Void>>> rpcResult = Futures.transform(sxpMasterDbItemFuture, new AsyncFunction<Collection<MasterDatabaseBinding>, List<RpcResult<Void>>>() {
             @Override
             public ListenableFuture<List<RpcResult<Void>>> apply(final Collection<MasterDatabaseBinding> input) throws Exception {
+                final ListenableFuture<List<RpcResult<Void>>> result;
                 if (input == null || input.isEmpty()) {
                     LOG.debug("no epPolicyTemplate available from sgt: {}", changeKey);
-                    throw new IllegalArgumentException("no epPolicyTemplate available");
+                    result = Futures.immediateFuture(Collections.singletonList(
+                            RpcResultBuilder.<Void>failed()
+                                    .withError(RpcError.ErrorType.APPLICATION,
+                                            "no ip-sgt mapping in sxpMasterDB available for " + changeKey)
+                                    .build()));
                 } else {
                     LOG.trace("processing sxpMasterDB event and epPolicyTemplate for sgt: {}", changeKey);
                     List<ListenableFuture<RpcResult<Void>>> allResults = new ArrayList<>(input.size());
                     for (MasterDatabaseBinding masterDBItem : input) {
-                            allResults.add(sxpMapperReactor.processPolicyAndSxpMasterDB(epPolicyTemplate, masterDBItem));
+                        allResults.add(sxpMapperReactor.processPolicyAndSxpMasterDB(epPolicyTemplate, masterDBItem));
                     }
-                    return Futures.successfulAsList(allResults);
+                    result = Futures.successfulAsList(allResults);
                 }
+
+                return result;
             }
         });
 
index 7a03b45fd5b25223afa3baa2155fa03f41e5cec9..27a31910bf1f9d1f4965a4692e8c2983092bde5b 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.groupbasedpolicy.sxp.mapper.api.DSAsyncDao;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.MasterDatabaseBindingListener;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SimpleCachedDao;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SxpMapperReactor;
+import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.ForwardingTemplateUtil;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.L3EPServiceUtil;
 import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.SxpListenerUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
@@ -36,7 +37,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.data
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -102,6 +105,13 @@ public class MasterDatabaseBindingListenerImpl implements MasterDatabaseBindingL
     }
 
     private void processWithEPForwardingTemplate(final IpPrefix changeKey, final MasterDatabaseBinding sxpMasterDBItem) {
+        if (!ForwardingTemplateUtil.isPlain(changeKey)) {
+            // SKIP SUBNET
+            LOG.debug("received ip-sgt binding with subnet ip - SKIPPING: {} - {}",
+                    changeKey, sxpMasterDBItem.getSecurityGroupTag());
+            return;
+        }
+
         final ListenableFuture<Optional<EndpointForwardingTemplateBySubnet>> epForwardingTemplateFuture =
                 epForwardingTemplateDao.read(changeKey);
 
@@ -127,13 +137,18 @@ public class MasterDatabaseBindingListenerImpl implements MasterDatabaseBindingL
         final ListenableFuture<RpcResult<Void>> rpcResult = Futures.transform(epPolicyTemplateFuture, new AsyncFunction<Optional<EndpointPolicyTemplateBySgt>, RpcResult<Void>>() {
             @Override
             public ListenableFuture<RpcResult<Void>> apply(final Optional<EndpointPolicyTemplateBySgt> input) throws Exception {
+                final ListenableFuture<RpcResult<Void>> result;
                 if (input == null || !input.isPresent()) {
                     LOG.debug("no epPolicyTemplate available for sgt: {}", changeKey);
-                    throw new IllegalArgumentException("no epPolicyTemplate available");
+                    result = RpcResultBuilder.<Void>failed()
+                                    .withError(RpcError.ErrorType.APPLICATION,
+                                            "no ip-sgt mapping in sxpMasterDB available for " + changeKey)
+                                    .buildFuture();
                 } else {
                     LOG.trace("processing sxpMasterDB event and epPolicyTemplate for sgt: {}", changeKey);
-                    return sxpMapperReactor.processPolicyAndSxpMasterDB(input.get(), sxpMasterDBItem);
+                    result = sxpMapperReactor.processPolicyAndSxpMasterDB(input.get(), sxpMasterDBItem);
                 }
+                return result;
             }
         });
 
index 3c7af75e4b890bc4beb0f7e1c268ffd756723444..0ee6f4d1d693f2e294e72ca976be7cbad7288de7 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.groupbasedpolicy.sxp.mapper.impl;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.Futures;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -15,11 +17,18 @@ import org.mockito.Matchers;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.runners.MockitoJUnitRunner;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointForwardingTemplateBySubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointPolicyTemplateBySgt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
 /**
@@ -28,6 +37,8 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 @RunWith(MockitoJUnitRunner.class)
 public class SxpMapperReactorImplTest {
 
+    private static final IpPrefix IP_PREFIX = new IpPrefix(new Ipv4Prefix("10.11.12.1/32"));
+
     @Mock
     private EndpointService l3EndpointService;
     @Mock
@@ -36,14 +47,22 @@ public class SxpMapperReactorImplTest {
     private MasterDatabaseBinding masterDBBinding;
     @Mock
     private EndpointForwardingTemplateBySubnet epForwardingTemplate;
+    @Mock
+    private DataBroker dataBroker;
+    @Mock
+    private ReadOnlyTransaction rTx;
 
     private SxpMapperReactorImpl sxpMapperReactor;
 
     @Before
     public void setUp() throws Exception {
-        sxpMapperReactor = new SxpMapperReactorImpl(l3EndpointService);
+        sxpMapperReactor = new SxpMapperReactorImpl(l3EndpointService, dataBroker);
         Mockito.when(l3EndpointService.registerEndpoint(Matchers.<RegisterEndpointInput>any()))
                 .thenReturn(RpcResultBuilder.<Void>success().buildFuture());
+        Mockito.when(masterDBBinding.getIpPrefix()).thenReturn(IP_PREFIX);
+        Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
+        Mockito.when(rTx.read(Matchers.same(LogicalDatastoreType.OPERATIONAL),
+                Matchers.<InstanceIdentifier<EndpointL3>>any())).thenReturn(Futures.immediateCheckedFuture(Optional.absent()));
     }
 
     @After
index a15a98b3f0e03608c086ffabc7c1098ff2250185..6dc1bb3449ce7ff7a2e8b903bacbde2405318a73 100644 (file)
@@ -89,6 +89,7 @@ public class EPPolicyTemplateDaoImplTest {
     public void testRead_presentDS() throws Exception {
         Mockito.when(cachedDao.find(Matchers.<Sgt>any())).thenReturn(
                 Optional.<EndpointPolicyTemplateBySgt>absent());
+        Mockito.when(cachedDao.isEmpty()).thenReturn(true);
         Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
         Mockito.when(rTx.read(Matchers.eq(LogicalDatastoreType.CONFIGURATION),
                 Matchers.<InstanceIdentifier<EndpointPolicyTemplateBySgt>>any())).thenReturn(
index 024e1615d4ab6ea5319de0fd848f08c68fb073fe..f0d4c8df68ab57141f886b0a6e26347d8cd3cf96 100644 (file)
@@ -118,6 +118,7 @@ public class MasterDatabaseBindingDaoImplTest {
         Mockito.when(cachedDao.find(Matchers.<IpPrefix>any())).thenReturn(
                 Optional.<MasterDatabaseBinding>absent(),
                 Optional.of(MASTER_DB_BINDING_VALUE));
+        Mockito.when(cachedDao.isEmpty()).thenReturn(true);
         Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
         Mockito.when(rTx.read(Matchers.eq(LogicalDatastoreType.CONFIGURATION),
                 Matchers.<InstanceIdentifier<Topology>>any())).thenReturn(